Streams和Lambda表达式按降序排序

时间:2018-03-31 11:22:30

标签: java lambda java-8

您好我使用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);
    }

4 个答案:

答案 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);

或者,您也可以先将学生映射到出生年份并对其进行排序,这可能会使比较步骤变得更加简单。