实现Java函数以对列表进行分组
发布时间:2023-06-12 05:51:45
在实际开发中,我们经常需要对列表进行分组操作。比如:按照性别分组、按照年龄段分组等等。在Java中,我们可以通过编写函数来实现列表分组。
1. 分组函数需求
我们要实现一个函数,该函数接收一个列表和一个分组规则,将列表按照分组规则进行分组,并返回一个Map对象。
函数定义为:
public static <T, K> Map<K, List<T>> group(List<T> list, Function<T, K> classifier)
其中,list为要分组的列表,classifier是一个Function类型的参数,该参数用于指定分组规则,返回值表示每个元素所属的组别。
例如,我们有一个Person类,Person类中有name和age两个属性。现在我们要按照age属性对Person类进行分组,在筛选出每个age段中最大的年龄的person。
2. 分组函数实现
实现方案如下:
public static Map<Integer, Person> groupByAge(List<Person> persons) {
Map<Integer, Person> result = new HashMap<>();
persons.stream().collect(Collectors.groupingBy(Person::getAge)).forEach((k, v) -> {
Optional<Person> oldestPerson = v.stream().max(Comparator.comparingInt(Person::getAge));
oldestPerson.ifPresent(person -> result.put(k, person));
});
return result;
}
该函数通过Stream流对Person列表进行分组,其中groupingBy方法指定了分组规则,即按照age属性进行分组。然后使用forEach()方法遍历分组结果,找到每个分组中年龄最大的person,并将该person放入结果的Map中。
3. 分组函数使用
使用该函数对Person列表进行分组的示例如下:
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Tom", 25));
persons.add(new Person("Jack", 32));
persons.add(new Person("Lucy", 29));
persons.add(new Person("Lily", 22));
persons.add(new Person("John", 38));
Map<Integer, Person> result = groupByAge(persons);
System.out.println(result);
}
运行结果如下:
{32=Person{name='Jack', age=32}, 25=Person{name='Tom', age=25}, 22=Person{name='Lily', age=22}, 29=Person{name='Lucy', age=29}, 38=Person{name='John', age=38}}
可以看到,每个分组的结果是以分组的属性值(即年龄)作为Map的键,而Map的值则是该分组中年龄最大的person。
