有一些细微差别我无法理解。
示例:我有一个类Person。描述人的标准 POJO 类,具有简单易懂的字段,例如名字、姓氏、年龄等。
任务也是标准的,比如过滤掉所有的成年人,或者只过滤掉女性。
过滤有效,但排序是个问题。
我写了 3 个排序选项
Comparator<Person> byFamily = (Person o1, Person o2 )-> o1.getFamily().compareTo(o2.getFamily());
Comparator<Person> byFamily2 = Comparator.comparing(Person::getFamily);
Comparator<Person> byName = Comparator.comparing(Person::getName);
不要关注代码的质量,我正在学习。
进一步的任务是在 List 中接收按姓氏排序的数据。
List<String> workers = persons.stream()
.filter(person -> person.getAge()>=18)
.filter(person -> person.getEducation() == Education.HIGHER)
.map(Person::getFamily)
.sorted(byFamily2);
.collect(Collectors.toList());
为什么排序不起作用?在上一步中,我从地图中的姓氏中得到了一个字符串 ((
该方法
.map()将传递给它的函数应用于所有流对象,并根据返回值形成一个新流。如果您已经Stream<Person>传递了一个接受Person并返回的函数String,那么它已经走得更远了Stream<String>。在
.map(Person::getFamily)那之后,已经有一个由行(姓氏)组成的流,结果在排序时,你尝试再次从比较器内部的每个姓氏中拉出姓氏。使用
.sorted()(只需将姓氏流排序为字符串),或.sorted(byFamily2)移到.map(Person::getFamily).那些。或者像这样:
或者像这样:
如果你需要按一个字段排序,然后提取另一个字段(例如,按名字排序,提取姓氏),那么自然需要在提取第二个字段之前进行排序,即 通过第二个选项。