您是否可以使用仿函数/函数式编程在Java 7中对列表进行分组(并计算每组的元素)?

你可以分组List types = new ArrayList(Arrays.asList(TypeEnum.A, TypeEnum.B, TypeEnum.A));Map countPerType; Java 8 之前使用仿函数(例如Google的Guava , Apache的Commons Functor )?

我试图了解函数式编程,但我不确定这种事情是否真的可行(因为我不只是映射集合值,而是试图聚合)?

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

 public Map countByGroup(List types) { Map 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; } 

编辑:依赖副作用似乎有点不合适 – 或者它是如何做到的……?

 Procedure count = new Procedure() { public Map 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 init(Map countPerType) { this.countPerType = countPerType; return this; } }.init(countPerType); // kudos http://stackoverflow.com/a/12206542/2018047 

OlivierGrégoire 评论了正确答案:

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

给定List types您可以使用create创建EnumMultiset

 Multiset multiset = EnumMultiset.create(types); 

您可以使用count查询Multiset元素的count

 multiset.count(TypeEnum.A); // 2 multiset.count(TypeEnum.B); // 1 
Interesting Posts