如何解决使用Java Stream API在地图中查找重复值
我正在尝试编写一个在map中找到重复值的程序,并且使用list和utiity方法创建此map。
我能够使用for循环获得预期的输出,但是使用该代码的时间太长了。
我尝试使用如下所示的java流API,但结果为空。
public class PrintListElements {
public static void main(String[] args) {
List<String> roles = new ArrayList<>();
roles.add("1");
roles.add("2");
roles.add("3");
roles.add("4");
roles.add("5");
roles.add("6");
roles.add("7");
roles.add("1");
HashMap<String,List<String>> idToMap = new HashMap<>();
roles.stream().map(role -> {
if (idToMap.containsKey(role)) {
return idToMap.get(role).add(getName(role));
} else {
return idToMap.put(role,new ArrayList<>(Arrays.asList(getName(role))));
}
})
idToMap.entrySet().forEach(e-> {
if(e.getValue().size()>1) {
System.out.println("found a key which has duplicate value : "+ e.getKey());
}
});
}
public static List<String> getNameLL(String id) {
ArrayList<String> ll = new ArrayList<String>();
ll.add(getName(id));
return ll;
}
public static String getName(String id) {
switch (id) {
case "1":
return "one";
case "2":
return "two";
case "3":
return "third";
case "4":
return "four";
case "5":
return "fifth";
case "6":
return "six";
case "7":
return "seven";
case "8":
return "one";
default:
return "one";
}
}
}
预期输出:
[one,one]
[two]
[three]
[four]
[five]
[six]
[seven]
任何人都可以帮助我,使用Java Stream API获得上述预期的输出结果
解决方法
您可以使用Collectors.groupingBy
来按键分组,也可以使用Collectors.mapping
来映射值并收集每个键的列表。
Map<String,List<String>> idToMap =
roles.stream()
.collect(Collectors.groupingBy(e -> e,Collectors.mapping(e -> getName(e),Collectors.toList())));
或者map
操作是惰性的,因此.map
内部的代码不会执行。您可以通过重构当前代码来使用forEach
之类的终端操作,
roles.forEach(role -> {
if (idToMap.containsKey(role)) {
idToMap.get(role).add(getName(role));
} else {
idToMap.put(role,new ArrayList<>(Arrays.asList(getName(role))));
}
});
可以使用Map
的{{1}}方法进行简化
merge
更新:如果您只想打印重复值,则可以使用roles.forEach(
role -> idToMap.merge(role,new ArrayList<>(Arrays.asList(getName(role))),(a,b) -> {
a.addAll(b);
return a;
}));
来获取密钥的频率,结果是收集为Collectors.counting()
Map<String,Integer>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。