需求描述
将 List 按照对象属性值是否相同进行分组,分割成多个连续的子 List。
代码实现
package com.suncd.trs.provider.controller;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
public class ListGrouping {
/**
* 将 List 按照对象属性值是否相同进行分组,分割成多个连续的子 List
* @param list 原始 List
* @param keyExtractor 提取对象属性值的函数
* @param <T> List 中对象的类型
* @param <K> 属性值的类型
* @return 分割后的子 List 集合
*/
public static <T, K> List<List<T>> groupByProperty(List<T> list, Function<T, K> keyExtractor) {
if (list == null || keyExtractor == null) {
throw new IllegalArgumentException("List 和 keyExtractor 不能为 null");
}
List<List<T>> result = new ArrayList<>();
if (list.isEmpty()) {
return result;
}
List<T> currentGroup = new ArrayList<>();
K previousKey = null;
for (T item : list) {
K currentKey = keyExtractor.apply(item);
// 如果是第一个元素,或者当前属性值与前一个不同,则开始新组
if (currentGroup.isEmpty() || !currentKey.equals(previousKey)) {
(!currentGroup.isEmpty()) {
result.add(currentGroup);
}
currentGroup = <>();
}
currentGroup.add(item);
previousKey = currentKey;
}
(!currentGroup.isEmpty()) {
result.add(currentGroup);
}
result;
}
{
List<Person> people = <>();
people.add( (, ));
people.add( (, ));
people.add( (, ));
people.add( (, ));
people.add( (, ));
people.add( (, ));
people.add( (, ));
List<List<Person>> groupedByAge = groupByProperty(people, Person::getAge);
System.out.println();
( ; i < groupedByAge.size(); i++) {
System.out.println( + (i + ) + + groupedByAge.get(i));
}
}
}
{
String name;
age;
{
.name = name;
.age = age;
}
String {
name;
}
{
age;
}
String {
name + + age + ;
}
}



