2 回答

TA貢獻1829條經(jīng)驗 獲得超7個贊
distinctByKey是一個 lambda 工廠方法。它正在返回一個Predictate<T>.
所以當你執(zhí)行時:filter(distinctByKey(String::toString))你實際上是distinctByKey先調(diào)用方法,然后返回一個Predicate. 然后為每個元素執(zhí)行該謂詞。只是工廠函數(shù)只會執(zhí)行一次。
移動System.out.println返回的 lambda 內(nèi)部時,您將獲得所需的打印語句:
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
System.out.println("inside distinctByKey method...");
Set<Object> seen = ConcurrentHashMap.newKeySet();
return t -> {
System.out.println("inside distinctByKey.lambda method... ");
return seen.add(keyExtractor.apply(t));
};
}

TA貢獻1796條經(jīng)驗 獲得超7個贊
這seen
是拍攝由lambda表達式和緩存的拉姆達里面,一旦你的回報Predicate
-在Predicate::test
將與被多次調(diào)用同一實例的seen
添加回答
舉報