首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能否使用函数式/函数式编程来对Java 7中的列表进行分组(并按组计算其元素)?

您能否使用函数式/函数式编程来对Java 7中的列表进行分组(并按组计算其元素)?
EN

Stack Overflow用户
提问于 2017-01-06 21:00:26
回答 1查看 229关注 0票数 1

您能使用函子(例如,List<TypeEnum> types = new ArrayList(Arrays.asList(TypeEnum.A, TypeEnum.B, TypeEnum.A));Apache公域函子)将pre Java 8组合成一个Map<TypeEnum, Integer> countPerType;吗?

我正试图把我的注意力放在函数式编程上,但我不确定这类事情是否真的是可能的(因为我不只是映射集合值,而是试图聚合)?

在命令式中,我会做这样的事情:

代码语言:javascript
复制
public Map<TypeEnum, Integer> countByGroup(List<TypeEnum> types) {
    Map<TypeEnum, Integer> countedTypes = new HashMap<>();
    for(TypeEnum type : types) {
        if(countedTypes.containsKey(type)) {
            countedTypes.put(type, countedTypes.get(type) + 1);
        } else {
            countedTypes.put(type, 1);
        }
    }
    return countedTypes;
}

编辑:依赖副作用的看起来有点不合适-或者是这样做的.?

代码语言:javascript
复制
Procedure<TypeEnum> count = new Procedure<TypeEnum>() {
public Map<TypeEnum, Integer> countPerType = null;

    @Override
    public void run(TypeEnum type) {
        if(countPerType.containsKey(type)) {
            countPerType.put(type, countPerType.get(type) + 1);
        } else {
            countPerType.put(type, 1);
        }
    }

    public Procedure<TypeEnum> init(Map<TypeEnum, Integer> countPerType) {
        this.countPerType = countPerType;
        return this;
    }
}.init(countPerType); // kudos http://stackoverflow.com/a/12206542/2018047
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-09 16:13:34

奥利维尔·格雷瓜尔 评论正确的答案:

使用番石榴,您需要一个简单的Multiset,更具体地说,它的EnumMultiset实现。Multiset是一种用于跟踪计数元素的数据结构。

给定您的List<TypeEnum> types,您可以使用create创建一个EnumMultiset

代码语言:javascript
复制
Multiset<TypeEnum> multiset = EnumMultiset.create(types);

并且可以使用Multiset查询count中元素的计数。

代码语言:javascript
复制
multiset.count(TypeEnum.A); // 2
multiset.count(TypeEnum.B); // 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41514257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档