如何使用 Java Stream API 根据元素的属性对元素进行分组

kur*_*ous 2 java java-stream

我有一个自然数列表。如何使用 Java Stream API 对所有可被 3、5 和两者整除的数字进行分组?

例如:

ArrayList<Integer> list = new ArrayList<>();
list.add(24);
list.add(25);
list.add(45);
list.add(30);
list.add(3);
list.add(20);
list.add(5);
Run Code Online (Sandbox Code Playgroud)

我想要 l3 = [3,24] ,l5 = [5,20,25],l35 = [45,30]

另外,我不想groupingBy()在名单上打电话三遍,因为名单真的很大。

Sha*_*awn 5

我将使用辅助枚举来描述数字的不同可能分类,并结合Collectors.groupingBy()

import java.util.*;
import java.util.stream.*;

public class Demo {

    private enum Fizzbuzz {
        DIV_BY_THREE, DIV_BY_FIVE, DIV_BY_BOTH, DIV_BY_NEITHER;

        static public Fizzbuzz classify(int i) {
            if (i % 3 == 0) {
                return i % 5 == 0 ? DIV_BY_BOTH : DIV_BY_THREE;
            } else if (i % 5 == 0) {
                return DIV_BY_FIVE;
            } else {
                return DIV_BY_NEITHER;
            }
        }
    }

    public static void main(String[] args) {
        List<Integer> list = List.of(24, 25, 45, 30, 3, 20, 5);
        Map<Fizzbuzz, List<Integer>> groups =
            list.stream().collect(Collectors.groupingBy(Fizzbuzz::classify));
        System.out.println(groups);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

{DIV_BY_THREE=[24, 3], DIV_BY_FIVE=[25, 20, 5], DIV_BY_BOTH=[45, 30]}
Run Code Online (Sandbox Code Playgroud)