您好我使用Lambda表达式对birthYear进行降序排序,但它不起作用。你能帮我吗 ?你能用以下代码检查我的位置:
final static List<Student> students = Arrays.asList(
new Student("Joe","Clay",1994,Gender.MALE),
new Student("Marie","Smith",1997,Gender.FEMALE),
new Student("Ann","Thompson",2000,Gender.FEMALE),
new Student("James","Bond",1989,Gender.MALE),
new Student("Jennifer","Atkins",1995,Gender.FEMALE),
new Student("Cristina","Gibbs",1999,Gender.FEMALE),
new Student("Jason","Clark",1998,Gender.MALE),
new Student("Kate","Barrett",1992,Gender.FEMALE),
new Student("Peter","Garner",1999,Gender.MALE),
new Student("Ben","Walsh",1996,Gender.MALE)
);
public static void runExercise8() {
List<Integer> years = students
.stream()
.sorted(Comparator.comparing(Student::getBirthYear).reverseOrder())
.collect(Collectors.toList());
System.out.println(years);
}
答案 0 :(得分:4)
看起来您希望结果作为整数列表,表示排序后考虑接收器类型的年份:
List<Integer> years
因此,要获得预期的结果,您需要这样做:
List<Integer> years =
students.stream()
.sorted(Comparator.comparing(Student::getBirthYear).reversed())
.map(s -> s.getBirthYear()) // transform to integers
.collect(Collectors.toList());
另外,请注意使用reversed()
而不是reverseOrder()
。
如果这不是意图,那么接收者类型以及查询应该是:
List<Student> resultSet =
students.stream()
.sorted(Comparator.comparing(Student::getBirthYear).reversed())
.collect(Collectors.toList());
另外,在这种情况下,最好使用Comparator.comparingInt
而不是Comparator.comparing
,因为前者效率更高。
示例:
.sorted(Comparator.comparingInt(Student::getBirthYear).reversed())
答案 1 :(得分:1)
我认为这里的根本问题是您正在尝试获取整数列表List<Integer>
,但您可以对学生进行排序。您需要在排序后添加.map(Student::getBirthYear)
以获取整数或将List<Integer>
更改为List<Student>
答案 2 :(得分:1)
我建议您使用这样的流:
List<Integer> years = students
.stream()
.map(s -> s.getBirthYear())
.sorted((Integer s1, Integer s2) -> -Integer.compare(s1, s2))
.collect(Collectors.toList());
它将首先映射年份,然后按降序排序。 首先绘制年份将为您提供更好的表现。
你的代码的问题是Comparator.comparing没有用,你期望一个Integer-List但是没有返回整数列表,而是学生。所以你必须映射它。
正确的Comparator.comparing将是:
.sorted(Comparator.comparing((Student s) -> s.getBirthYear()).reversed())
答案 3 :(得分:1)
如果您想要取回学生列表,您只想使用Comparators.reverse()
方法:
List<Student> sortedStudents = students
.stream()
.sorted(Comparator.comparing(Student::getBirthYear).reversed())
.collect(Collectors.toList());
System.out.println(sortedStudents);
但是,如果你真的想要一个年份列表,我想你会想要添加一个额外的地图步骤来从Student
对象中提取它:
List<Integer> years = students
.stream()
.sorted(Comparator.comparing(Student::getBirthYear).reversed())
.map(Student::getBirthYear)
.collect(Collectors.toList());
System.out.println(years);
或者,您也可以先将学生映射到出生年份并对其进行排序,这可能会使比较步骤变得更加简单。