Ваш первый фрагмент создает новый экземпляр Set
каждый раз, когда выполняется тело лямбда-выражения, что означает один раз для каждого элемента Stream
. Поэтому каждый раз, когда фильтр применяется к элементу Stream
, он добавляет элемент к другому экземпляру Set
, поэтому он не может отфильтровать дубликаты.
Во втором фрагменте * Экземпляр 1007 * создается один раз, когда выполняется distincyByKey()
. Когда фильтр оценивается для каждого элемента Stream
, выполняется лямбда-тело просто seen.add(keyExtractor.apply(t)
, и оно всегда выполняется для одного и того же Set
экземпляра.
Вы можете добиться того же поведения без static
метод путем создания экземпляра Set
вне конвейера Stream или использования ссылки на метод:
Set<String> seen = ConcurrentHashMap.newKeySet();
List<String> list1 =
list.parallelStream().filter(e-> seen.add(e)).collect(Collectors.toList());
или
List<String> list1 =
list.parallelStream().filter(ConcurrentHashMap.newKeySet()::add).collect(Collectors.toList());
РЕДАКТИРОВАТЬ: я удалил getLastName()
вызов метода из кода, поскольку ваш Stream
является Stream<String>
, а String
s не имеют getLastName()
метода. Я предполагаю, что вы перепутали некоторые фрагменты кода.