我想通过主键区分一个列表,为什么Set<Object> seen = ConcurrentHashMap.newKeySet();
只执行一次,而seen.add(keyExtractor.apply(t));
对列表中的每个元素都执行?
方法distinctByKey
是无状态的吗?
public static void main(String[] args) {
List<UserInfo> list = new ArrayList<>();
list.add(new UserInfo(1, "a"));
list.add(new UserInfo(2, "b"));
list.add(new UserInfo(2, "c"));
List<UserInfo> result = list.stream()
.filter(distinctByKey(userInfo -> userInfo.id))
.collect(Collectors.toList());
System.out.println(result);
}
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Set<Object> seen = ConcurrentHashMap.newKeySet();
return (t) -> {
return seen.add(keyExtractor.apply(t));
};
}
1条答案
按热度按时间weylhg0b1#
如果你想通过键区分,你可以使用 Package 器。Java流API不提供通过自定义规则区分的方法,它依赖于类的equals()和hashCode()方法。
如果我们想使用自定义区分,那么我们可以创建 Package 器类,在那里我们可以覆盖给定的方法:
输出:
而且它肯定会是纯粹的无状态解决方案。