gpt4 book ai didi

java - 简化java流以查找重复属性

转载 作者:行者123 更新时间:2023-12-01 12:29:03 25 4
gpt4 key购买 nike

我有一个 users list 并且我想找到所有具有重复名称的用户:

var allNames = users
.stream()
.map(u -> u.getName()).collect(Collectors.toList());

var duplicateNames = allNames
.stream()
.filter(i -> Collections.frequency(allNames, i) > 1)
.collect(Collectors.toSet());

我可以改进/简化上述解决方案吗?

例如,实际上我创建了一个包含所有名称的列表,然后对其进行过滤。如何遍历列表以查找其重复名称而不创建附加列表 allNames ?

最佳答案

一种解决方案是

var duplicate = users.stream()
.collect(Collectors.toMap(User::getName, u -> false, (x,y) -> true))
.entrySet().stream()
.filter(Map.Entry::getValue)
.map(Map.Entry::getKey)
.collect(Collectors.toSet());

这将创建一个中间 Map<String,Boolean>记录哪个名称出现多次。您可以使用 keySet()该 map 而不是收集到一个新的 Set :
var duplicate = users.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(User::getName, u -> false, (x,y) -> true, HashMap::new),
m -> {
m.values().removeIf(dup -> !dup);
return m.keySet();
}));

循环解决方案可以简单得多:
HashSet<String> seen = new HashSet<>(), duplicate = new HashSet<>();
for(User u: users)
if(!seen.add(u.getName())) duplicate.add(u.getName());

关于java - 简化java流以查找重复属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61011453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com