使用 Java 中的流,按成员字段中集合的大小对对象列表进行排序

Ark*_*usz 0 java

我创建一个记录用户:

\n
public record User(String name, int age, List<String> skills, boolean isActive) {\n}\n
Run Code Online (Sandbox Code Playgroud)\n

和用户列表:

\n
    private static List<User> prepareData() {\n        List<User> users = new ArrayList<>();\n\n        users.add(new User("Kamil", 35, List.of("Java", "Python", "JavaScript"), true));\n        users.add(new User("Mariusz", 36, List.of("Java", "C++", "C#"), true));\n        users.add(new User("Dominik", 30, List.of("Java", "Dart", "Python"), false));\n        users.add(new User("Paulina", 36, List.of("PHP", "SQL", "Python"), false));\n        users.add(new User("Rafa\xc5\x82", 40, List.of("C#", "Dart"), true));\n        users.add(new User("Agnieszka", 29, List.of("Java", "Scala", "Kotlin", "Haskell", "Clojure"), false));\n        users.add(new User("Weronika", 43, List.of("Python", "C#", "VBA"), true));\n\n        return users;\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

现在我需要找到一个了解最多技术的用户(使用流!)并显示他的姓名和技术列表。我一直在尝试了解如何对流中的列表进行排序。我尝试过使用比较器方法,但它抛出一个错误:

\n
        users.stream()\n                .sorted(Comparator.comparing(User::skills))\n
Run Code Online (Sandbox Code Playgroud)\n

知道该怎么做吗?

\n

Geo*_*vov 6

您可以使用Stream#max而不是排序:

User result = users.stream()
                .max(Comparator.comparingInt(user -> user.skills.size()))
                .orElse(null);
Run Code Online (Sandbox Code Playgroud)

  • 事实上,“max”将是“O(N)”,而排序将是“O(NlogN)”并且速度明显慢。 (4认同)