Java Stream:类 com.java8.Student 无法转换为类 java.lang.Comparable

Fah*_*nej 2 java comparable java-8 java-stream

Student使用 java 8 的自然排序方法迭代所有数据sorted()。迭代学生数据时,在 IDE 控制台中出现异常class com.java8.Student cannot be cast to class java.lang.Comparable。我的StreamStudent.java文件在com.java8包内。

这是我的完整堆栈跟踪:

Exception in thread "main" java.lang.ClassCastException: class com.java8.Student cannot be cast to class java.lang.Comparable (com.java8.Student is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
    at java.base/java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:47)
    at java.base/java.util.TimSort.countRunAndMakeAscending(TimSort.java:355)
    at java.base/java.util.TimSort.sort(TimSort.java:220)
    at java.base/java.util.Arrays.sort(Arrays.java:1307)
    at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:353)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
    at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
    at com.java8.StreamStudent.main(StreamStudent.java:72)
Run Code Online (Sandbox Code Playgroud)

下面是我的代码:

package com.java8;

import java.util.*;
import java.util.stream.*;

class Student{
    String firstName;
    String lastName;
    Integer groupId;
    Integer age;

    // constructor and getter, setter

}

public class StreamStudent {
    public static void main(String[] args) {
        List<Student> stdList = new ArrayList<>();
        stdList.add(new Student("Sara", "Mills", 1, 18));
        stdList.add(new Student("Andrew", "Gibson", 2, 21));
        stdList.add(new Student("Craig", "Ellis", 1, 23));
        stdList.add(new Student("Steven", "Cole", 2, 19));
        stdList.add(new Student("Andrew", "Carter", 2, 2));

        
        System.out.println("1. Sort all student firstname by name");
        List<Student> students =  stdList.stream().sorted().collect(Collectors.toList());
        students.forEach((s) -> System.out.println(s.getFirstName() + " " + s.getLastName() + " " + s.getGroupId() + " " + s.getAge()));
    }
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*ire 7

Student必须实现Comparable。Comparable 的实现定义了自然排序。

该接口对实现它的每个类的对象强加了总排序。这种排序称为类的自然排序,而类的compareTo 方法称为其自然比较方法。

public class Student implements Comparable<Student> {

  @Override
  public int compareTo(Student o) {
    //implement comparison here
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)