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'}]}
*/

参考:https://blog.csdn.net/HO1_K/article/details/127572093

在 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()
posted @ 2023-12-09 22:09  chuangzhou  阅读(77)  评论(0)    收藏  举报