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

如何让Collectors.groupingBy()返回排序后的LinkedHashMap?

Collectors.groupingBy() 是 Java 8 引入的一个非常有用的流操作,它允许你根据某个属性对集合中的元素进行分组。然而,groupingBy() 默认返回的是一个 HashMap,它不保证元素的顺序。如果你想要返回一个排序后的 LinkedHashMap,你需要在收集结果之后对其进行排序。

以下是一个示例代码,展示了如何实现这一点:

代码语言:txt
复制
import java.util.*;
import java.util.stream.Collectors;

public class GroupingByExample {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
            new Person("Alice", 20),
            new Person("Bob", 30),
            new Person("Charlie", 20),
            new Person("David", 30),
            new Person("Eve", 25)
        );

        // 使用 Collectors.groupingBy() 分组,并将结果转换为 LinkedHashMap
        Map<Integer, List<Person>> groupedByAge = people.stream()
            .collect(Collectors.groupingBy(Person::getAge))
            .entrySet().stream()
            .sorted(Map.Entry.comparingByKey())
            .collect(Collectors.toMap(
                Map.Entry::getKey,
                Map.Entry::getValue,
                (oldValue, newValue) -> oldValue,
                LinkedHashMap::new
            ));

        // 打印结果
        groupedByAge.forEach((age, list) -> {
            System.out.println(age + ": " + list);
        });
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return name;
    }
}

在这个示例中,我们首先使用 Collectors.groupingBy() 根据年龄对人员进行分组。然后,我们对分组的结果进行排序,并将其转换为 LinkedHashMap。这里的关键步骤是使用 entrySet().stream() 来获取分组的条目流,然后使用 sorted(Map.Entry.comparingByKey()) 对这些条目按照键(在这个例子中是年龄)进行排序。最后,我们使用 Collectors.toMap() 将排序后的条目收集到一个新的 LinkedHashMap 中。

参考链接:

这种方法的优势在于它保持了分组的顺序,并且可以很容易地集成到现有的流操作中。它适用于任何需要对分组结果进行排序的场景,例如当你需要按照某个属性展示分组数据时。

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

相关·内容

领券