我编写了以下代码片段来计算每个元素出现的次数。是否有可能以更短的方式实现这一目标?
int[] arr = {1, 6, 2, 8, 5, 4, 7, 7, 5, 7};
Arrays.stream(arr)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll)
.stream()
.collect(Collectors.groupingBy(s -> s))
.forEach((k, v) -> System.out.println(k+" "+v.size()));
另外我想只显示出现次数超过 1 次的元素。所以我尝试如下修改,结果出现错误。
.forEach((k, v) -> if(v.size() > 1) System.out.println(k+" "+v.size()));
这样做的正确方法是什么?
对于后一个问题,你必须改变
.forEach((k, v) -> if(v.size() > 1) System.out.println(k+" "+v.size()));
to
.forEach((k, v) -> {if(v.size() > 1) System.out.println(k+" "+v.size());});
对于第一部分,不清楚为什么需要第一个collect
接下来是第二个Stream
管道。
如果目的是转换IntStream
to a Stream<Integer>
, use boxed()
:
Arrays.stream(arr)
.boxed()
.collect(Collectors.groupingBy(s -> s))
.forEach((k, v) -> System.out.println(k+" "+v.size()));
正如 Dici 建议的那样,您还可以链接收集器以将每个数字及其出现次数分组:
Map<Integer,Integer> occurrences =
Arrays.stream(arr)
.boxed()
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)