在Java中,你可以使用Stream API的collect
方法和Collectors.groupingBy
方法按一个属性分组,并使用Collectors.maxBy
方法按另一个属性收集最大元素
import java.util.*;
import java.util.stream.Collectors;
class Person {
private String name;
private int age;
private double salary;
public Person(String name, int age, double salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public double getSalary() {
return salary;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", salary=" + salary +
'}';
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 30, 50000),
new Person("Bob", 25, 55000),
new Person("Charlie", 30, 60000),
new Person("David", 25, 65000)
);
Map<Integer, Optional<Person>> groupedByAgeAndMaxSalary = people.stream()
.collect(Collectors.groupingBy(
Person::getAge,
Collectors.maxBy(Comparator.comparingDouble(Person::getSalary))
));
groupedByAgeAndMaxSalary.forEach((age, personOpt) -> {
System.out.println("Age: " + age + ", Person with max salary: " + personOpt.orElse(null));
});
}
}
在这个示例中,我们首先创建了一个Person
类,包含name
、age
和salary
属性。然后,我们创建了一个Person
对象的列表。
接下来,我们使用stream()
方法创建一个流,并使用collect()
方法和Collectors.groupingBy()
方法按age
属性分组。我们还使用Collectors.maxBy()
方法按salary
属性收集最大元素。
最后,我们遍历分组后的结果,并打印每个年龄组中薪水最高的Person
对象。
运行这个程序,你将看到以下输出:
Age: 25, Person with max salary: Person{name='David', age=25, salary=65000.0}
Age: 30, Person with max salary: Person{name='Charlie', age=30, salary=60000.0}
这表明我们已经成功地按年龄分组,并按薪水收集了最大元素。
领取专属 10元无门槛券
手把手带您无忧上云