我检查了以下片段:
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> computed = new ConcurrentHashMap<>();/*IS THIS LINE CALLED ONCE ON STREAM->FILTER NOT MATTER HOW LONG THE STREAM IS*/
return t -> {return computed.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;};
}
private void test(){
final long d = Stream.of("JOHN","STEPHEN","ORTIZ","RONDON")
.filter(distinctByKey(Function.identity()))
.count();
System.out.println("d = " + d);
}
这段代码不是我的。我知道在这个例子中使用 aConcurrentMap不是正确的选择,在这种情况下我应该使用ConcurrentMap而不是Map,但这不是我现在关心的问题。
我认为distinctByKey在每次迭代中调用或解释该方法Stream。我的意思Map是在每一轮都被实例化,但事实并非如此!
方法体Predicate只调用一次吗?
在Stream迭代中,这是一个断言吗?
因为当我尝试以下代码时:
final Function<String,Integer>a = (name)->name.length();
System.out.println(distinctByKey(a).test("JOHN"));
System.out.println(distinctByKey(a).test("STEPHEN"));
System.out.println(distinctByKey(a).test("ORTIZ"));
System.out.println(distinctByKey(a).test("RONDON"));
我可以看到方法的主体确实在每一行中都被调用了。是什么让过滤器的主体只被调用一次?
RISEBY
慕田峪4524236
慕斯709654
相关分类