通过计数Java 8流API进行分组

Muh*_*edy 146 java functional-programming java-8

我试着在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]));
Run Code Online (Sandbox Code Playgroud)

我很感激你的意见.

Jon*_*eet 297

我认为你只是在寻找重载,它需要另一个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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

{Hello=2, World=1}
Run Code Online (Sandbox Code Playgroud)

(还有可能使用groupingByConcurrent更高的效率.如果在您的上下文中它是安全的,请记住您的真实代码.)

  • 使用Function.identity()(使用静态导入)而不是e - > e使它更好看:Map <String,Long> counting = list.stream().collect(groupingBy(identity(),counting() )); (6认同)
  • @MichaelKors:如果您还有其他问题,您应该在进行适当的研究后将其作为单独的帖子提出。 (2认同)

小智 8

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));
collect.entrySet()
       .forEach(e -> System.out.println(e.getKey() + " - " + e.getValue().size()));
Run Code Online (Sandbox Code Playgroud)


use*_*739 6

这是StreamEx的简单解决方案:

StreamEx.of(list).groupingBy(Function.identity(), MoreCollectors.countingInt());
Run Code Online (Sandbox Code Playgroud)

这样做的优点是减少了 Java 流样板代码:collect(Collectors.

  • 使用它而不是 Java8 流的原因是什么? (3认同)

Ous*_* D. 6

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

使用toMap

list.stream()
    .collect(Collectors.toMap(Function.identity(), e -> 1, Math::addExact));
Run Code Online (Sandbox Code Playgroud)

使用Map::merge

Map<String, Integer> accumulator = new HashMap<>();
list.forEach(s -> accumulator.merge(s, 1, Math::addExact));
Run Code Online (Sandbox Code Playgroud)


小智 5

这是对象列表的示例

Map<String, Long> requirementCountMap = requirements.stream().collect(Collectors.groupingBy(Requirement::getRequirementType, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)