JAVA - Collections - groupingBy 和 partitionBy
public class Test1 {
public static void main(String[] args) {
Student s = new Student("张三",18,"唱歌");
Student s1 = new Student("李四",27,"跳舞");
Student s2 = new Student("王五",26,"学习JAVA");
Student s3 = new Student("旺财",19,"LOL");
Student s4 = new Student("旺财",19,"唱歌");
Student s5 = new Student("旺财",19,"学习JAVA");
List<Student> studens = new ArrayList<Student>();
studens.add(s);
studens.add(s1);
studens.add(s2);
studens.add(s3);
studens.add(s4);
studens.add(s5);
//根据学生的兴趣爱好分组
Map<String, List<Student>> map = studens.stream().collect(Collectors.groupingBy(Student::getHobby));
System.out.println(map);
}
}
/*
{唱歌=[Student{name='张三', age=18, hobby='唱歌'}, Student{name='旺财', age=19, hobby='唱歌'}], LOL=[Student{name='旺财', age=19, hobby='LOL'}], 跳舞=[Student{name='李四', age=27, hobby='跳舞'}], 学习JAVA=[Student{name='王五', age=26, hobby='学习JAVA'}, Student{name='旺财', age=19, hobby='学习JAVA'}]}
*/
在 Java 中,并没有标准库(如 java.util.Collections)提供名为 partitionBy 的方法。你提到的 Collections.partitionBy 可能是以下几种情况之一:
🔍 1. Java Stream 中的 Collectors.partitioningBy()
如果你是想根据某个条件(谓词)将集合中的元素分为两组(true 和 false),可以使用 Java 8+ Stream API 中的:
✅ Collectors.partitioningBy(Predicate<? super T> predicate)
这是最接近你提到的 partitionBy 的功能。
示例:
import java.util.*;
import java.util.stream.Collectors;
public class PartitionByExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<Boolean, List<Integer>> partitioned = numbers.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println(partitioned);
// 输出: {false=[1, 3, 5], true=[2, 4, 6]}
}
}
说明:
- 所有满足条件的元素分到
true键下; - 不满足的分到
false键下。
🔍 2. 自定义实现 partitionBy(按任意属性分类)
如果你想根据某个“属性”或“函数值”来对元素进行分区,可以使用:
✅ Collectors.groupingBy()
例如,按照数字是否为偶数、奇数进行分组(与上面类似),或者更复杂的逻辑:
Map<String, List<Integer>> grouped = numbers.stream()
.collect(Collectors.groupingBy(n -> n % 2 == 0 ? "even" : "odd"));
// 输出: {even=[2, 4, 6], odd=[1, 3, 5]}
System.out.println(grouped);
🧩 总结
| 功能 | 类/方法 | 说明 |
|---|---|---|
Lists.partition(list, size) |
Guava | 按固定大小切分列表 |
Collectors.partitioningBy(predicate) |
Java Stream | 根据布尔条件分成两组 |
Collectors.groupingBy(classifier) |
Java Stream | 按任意规则分组(多组) |
📌 如果你想要 partitionBy 这样的方法(比如 Scala 或 Kotlin 中的那种)
你可以自己封装一个通用的方法,比如:
public static <T> Map<Boolean, List<T>> partitionBy(List<T> list, Predicate<T> predicate) {
return list.stream()
.collect(Collectors.partitioningBy(predicate));
}
用法:
Map<Boolean, List<String>> result = partitionBy(
Arrays.asList("apple", "banana", "cherry", "date"),
s -> s.length() > 5
);
// 输出: {false=[apple, date], true=[banana, cherry]}
System.out.println(result);
✅ 结论:
- 如果你要按大小分块 ➜ 使用
Lists.partition()(来自 Guava) - 如果你要按条件分组 ➜ 使用
Collectors.partitioningBy() - 如果你要按任意属性分组 ➜ 使用
Collectors.groupingBy()
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/17891896.html

浙公网安备 33010602011771号