Я изучил следующий фрагмент:
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);
}
Этот код не мой. Я знаю, что использование ConcurrentMap
не является правильным выбором в этом примере, и я должен использовать 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"));
Я вижу, что тело метода действительно вызывается в каждой строке. Что заставляет тело фильтра вызываться только один раз?