首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java Stream按一个属性分组,并按另一个属性收集max元素

在Java中,你可以使用Stream API的collect方法和Collectors.groupingBy方法按一个属性分组,并使用Collectors.maxBy方法按另一个属性收集最大元素

代码语言:javascript
复制
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类,包含nameagesalary属性。然后,我们创建了一个Person对象的列表。

接下来,我们使用stream()方法创建一个流,并使用collect()方法和Collectors.groupingBy()方法按age属性分组。我们还使用Collectors.maxBy()方法按salary属性收集最大元素。

最后,我们遍历分组后的结果,并打印每个年龄组中薪水最高的Person对象。

运行这个程序,你将看到以下输出:

代码语言:javascript
复制
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}

这表明我们已经成功地按年龄分组,并按薪水收集了最大元素。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券