对于后一个问题,你必须改变
.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());});
对于第一部分,不清楚为什么需要第一个集合后跟第二个Stream管道.
如果目的是将IntStream转换为Stream< Integer>,请使用boxed():
Arrays.stream(arr)
.boxed()
.collect(Collectors.groupingBy(s -> s))
.forEach((k, v) -> System.out.println(k+" "+v.size()));
正如Dici建议的那样,您也可以将收集器链接起来,将每个数字与其出现次数分组:
Map occurrences =
Arrays.stream(arr)
.boxed()
.collect(Collectors.groupingBy(s -> s, Collectors.counting()));