2 回答

TA贡献1829条经验 获得超7个赞
distinctByKey是一个 lambda 工厂方法。它正在返回一个Predictate<T>.
所以当你执行时:filter(distinctByKey(String::toString))你实际上是distinctByKey先调用方法,然后返回一个Predicate. 然后为每个元素执行该谓词。只是工厂函数只会执行一次。
移动System.out.println返回的 lambda 内部时,您将获得所需的打印语句:
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条经验 获得超7个赞
这seen
是拍摄由lambda表达式和缓存的拉姆达里面,一旦你的回报Predicate
-在Predicate::test
将与被多次调用同一实例的seen
添加回答
举报