按Java 8流API分组

我尝试在Java 8流API中找到一种简单的方法来进行分组,我提出了这种复杂的方法!


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]));

感谢您的投入。


动漫人物
浏览 367回答 3
3回答

一只萌萌小番薯

我认为您只是在寻找过载,它需要另一个负载Collector来指定对每个组的处理方式...然后Collectors.counting()进行计数:import java.util.*;import java.util.stream.*;class Test {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; List<String> list = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; list.add("Hello");&nbsp; &nbsp; &nbsp; &nbsp; list.add("Hello");&nbsp; &nbsp; &nbsp; &nbsp; list.add("World");&nbsp; &nbsp; &nbsp; &nbsp; Map<String, Long> counted = list.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(counted);&nbsp; &nbsp; }}结果:{Hello=2, World=1}(也有可能使用groupingByConcurrent来提高效率。如果在您的上下文中安全的话,请记住您的真实代码。)

慕尼黑5688855

这是完成手头任务的略有不同的选择。使用toMap:list.stream()&nbsp; &nbsp; .collect(Collectors.toMap(Function.identity(), e -> 1, Math::addExact));使用Map::merge:Map<String, Integer> accumulator = new HashMap<>();list.forEach(s -> accumulator.merge(s, 1, Math::addExact));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java