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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章