问题

我试着在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]));

我很感激你的意见。


#1 热门回答(211 赞)

我想你只是在找3888255664,需要另外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提高效率。如果在你的上下文中安全,请记住你的真实代码。)


#2 热门回答(4 赞)

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

#3 热门回答(3 赞)

这是StreamEx的简单解决方案

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

减少样板代码:collect(Collectors.


原文链接