2021/03/14

[筆記] Effective Java #43 方法引用優先於 Lambda

Effective Java 3rd 簡體中文版筆記 #43 方法引用優先於 Lambda
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
轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2021/03/effective-java-43-lambda.html

沒有留言:

張貼留言