为了账号安全,请及时绑定邮箱和手机立即绑定

按Java 8流API分组

按Java 8流API分组

动漫人物 2019-10-06 15:13:09
我尝试在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]));感谢您的投入。
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

我认为您只是在寻找过载,它需要另一个负载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来提高效率。如果在您的上下文中安全的话,请记住您的真实代码。)


查看完整回答
反对 回复 2019-10-06
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

这是完成手头任务的略有不同的选择。


使用toMap:


list.stream()

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


查看完整回答
反对 回复 2019-10-06
  • 3 回答
  • 0 关注
  • 365 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信