list stream: 对List中的对象先进行排序再获取前n个对象

开发中我们经常会对一个List中的对象进行排序,使用排序后的结果来进行计算或使用,今天来介绍一个非常简洁的对List中对象进行排序,排序后的结果我们只获取前N个对象,接下来我们就来看一下这个方法:

List<Integer> integerList = new ArrayList<>();
        integerList.add(2);
        integerList.add(3);
        integerList.add(10);
        integerList.add(5);
        System.out.println(integerList.stream().sorted().limit(2).collect(Collectors.toList()));

上面是一个最简单的例子,我们将一个整数List中的每一个数通过默认的排序方法进行排序,排序完成后,只获取这个结果中的前两个数。
下面在来看一个稍微复杂一些的,通过自定义一个的对象比较方法来进行排序:

List<TestUser> testUserList = new ArrayList<>();
        TestUser testUserOne = TestUser.builder().id(1).age(10.0).name("one").build();
        testUserList.add(testUserOne);

        TestUser testUserTwo = TestUser.builder().id(2).age(20.0).name("two").build();
        testUserList.add(testUserTwo);

        TestUser testUserThree = TestUser.builder().id(3).age(15.0).name("three").build();
        testUserList.add(testUserThree);

        System.out.println(testUserList.stream().sorted(Comparator.comparing(TestUser::getAge)).limit(2).collect(Collectors.toMap(TestUser::getId, TestUser -> TestUser)));

上面的这个例子是将TestUser组成的List进行排序,我们排序的标准是TestUser中的age字段,然后我们只保留排序结果中的前两个对象,然后将对象保存成一个Map,以对象的id作为key,以对象本身作为value。

List<TestUser> testUserList = new ArrayList<>();
        TestUser testUserOne = TestUser.builder().id(1).age(10.0).name("one").build();
        testUserList.add(testUserOne);

        TestUser testUserTwo = TestUser.builder().id(2).age(20.0).name("two").build();
        testUserList.add(testUserTwo);

        testUserList.add(testUserTwo);

        TestUser testUserThree = TestUser.builder().id(3).age(15.0).name("three").build();
        testUserList.add(testUserThree);

        System.out.println(testUserList.stream().sorted(Comparator.comparing(TestUser::getAge)).limit(4).collect(Collectors.toMap(TestUser::getId, TestUser -> TestUser)));

如果将代码改成如上所示,你就会发现其实上面的代码是存在缺陷的,该处的缺陷就是当List中存在两个相同的对象的时候,程序不知道该如何来选择,我们对上面的代码做如下的修改,这个问题就迎刃而解啦:

List<TestUser> testUserList = new ArrayList<>();
        TestUser testUserOne = TestUser.builder().id(1).age(10.0).name("one").build();
        testUserList.add(testUserOne);

        TestUser testUserTwo = TestUser.builder().id(2).age(20.0).name("two").build();
        testUserList.add(testUserTwo);

        testUserList.add(testUserTwo);

        TestUser testUserThree = TestUser.builder().id(3).age(15.0).name("three").build();
        testUserList.add(testUserThree);

        System.out.println(testUserList.stream().sorted(Comparator.comparing(TestUser::getAge)).limit(4).collect(Collectors.toMap(TestUser::getId, TestUser -> TestUser, (v1, v2) -> v1 )));

出现上述问题的主要原因是由于在map中已经存在了相同的key,该方法无法确定要保留哪一个value,通过 (v1, v2) -> v1 的方法就可以确定是保留原来的对象,如果要保留新put的对象的话,就用(v1, v2) -> v2。

通过上面的介绍,我们知道了Stream中的sorted()和limit()的简单的用法,希望可以对你有用。

最后,将上面实例中的TestUser对象贴出来:

@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
public class TestUser {
    private Integer id;

    private String name;

    private Double age;

    private String remark;

    private Long code;
}

我的原文地址链接:https://community.jiguang.cn/article/464305

猜你喜欢

转载自blog.csdn.net/zhangzehai2234/article/details/104957925