通过计数Java 8streamAPI进行分组

我尝试在Java 8streamAPI中find一个简单的方法来做分组,我用这种复杂的方式出来了!

List<String> list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List<String>> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); List<String[]> collect2 = collect .entrySet() .stream() .map(e -> new String[] { e.getKey(), String.valueOf(e.getValue().size()) }) .collect(Collectors.toList()); collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1])); 

我感谢你的意见。

我想你只是在寻找重载 ,这需要另一个Collector来指定如何处理每个组…然后Collectors.counting()来进行计数:

 import java.util.*; import java.util.stream.*; class Test { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, Long> counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); System.out.println(counted); } } 

结果:

 {Hello=2, World=1} 

(也可以使用groupingByConcurrent来获得更高的效率。如果在你的上下文中它是安全的,那么要记住你真正的代码。)

  List<String> list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List<String>> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); collect.entrySet().forEach(e -> System.out.println(e.getKey() + " >> " + e.getValue().size())); 

这是StreamEx的简单解决scheme

 StreamEx.of(list).groupingBy(Function.identity(), Collectors.countingInt()); 

减less样板代码: collect(Collectors.