开发中我们经常会对一个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;
}