Lambda 相較於匿名類優勢在於更簡潔,Java 提供比 Lambda 更簡潔的一種語法,方法引用 (method reference)。在下面的 merge 方法中,若 get(key) == null 就執行 map.put(key, value),反之執行 newValue = remappingFunction.apply(get(key), value) 接著再執行 map.put(key, newValue)。remappingFunction 可以使用 Lambda 傳入,目的是將兩數相加,方法引用可以用 Integer::sum 來取代。
default V merge(K key, V value,
BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
}
map.merge(key, 1, (count, incr) -> count + incr);
map.merge(key, 1, Integer::sum);
只要是方法引用能處理的,沒有 Lambda 不能完成的。如果 Lambda 太長,可以將程式碼擷取出來,然後用該方法的引用代替 Lambda。public void run() {
executorService.submit(this::start);
}
private void start() { ... }
許多方法引用都是靜態方法,以下有 5 種方法引用,有限制的引用相似於靜態方法引用,無限制的引用多用在 stream pipeline 中的 mapping 或是 filter,最後有 2 種的 constructor 引用方式。- 靜態:Integer::parseInt
- 有限制 (bound):Instant.now()::isAfter
- 無限制 (unbound):String::toLowerCase
- 類構造器:TreeMap<K,V>::new
- 陣列構造器:int[]::new
沒有留言:
張貼留言