我有一个自然数列表。如何使用 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()在名单上打电话三遍,因为名单真的很大。
我将使用辅助枚举来描述数字的不同可能分类,并结合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)
| 归档时间: |
|
| 查看次数: |
368 次 |
| 最近记录: |