我正在使用java 8 Student
的自然排序方法迭代所有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)
下面是我的代码:
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()));
}
}
发布于 2022-06-14 06:49:36
Student
必须实现可比的。可比较的实现定义了自然排序。
此接口对实现该接口的每个类的对象强制执行总体排序。这种排序称为类的自然排序,类的compareTo方法称为其自然比较方法。
public class Student implements Comparable<Student> {
@Override
public int compareTo(Student o) {
//implement comparison here
return 0;
}
}
发布于 2022-06-14 07:09:26
流的元素必须实现Comparable
接口,才能通过sorted()
流操作进行排序。或者,如果无法更改Student
类的实现,则可以向重载的版本sorted(Comparator<? super T> comparator)
提供Comparator
实例。这样,您仍然可以对元素进行排序,而不必更改Student
的实现。
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#sorted-java.util.Comparator-
学生实施可比
class Student implements Comparable<Student> {
String firstName;
String lastName;
Integer groupId;
Integer age;
// constructor and getter, setter
@Override
public int compareTo(Student o) {
return Comparator.comparing(Student::getFirstName).thenComparing(Student::getLastName).compare(this, o);
}
}
public class StreamStudent {
public static void main(String[] args) {
// ... same code of yours ...
List<Student> students = stdList.stream().sorted().collect(Collectors.toList());
// ... same code of yours ...
}
}
为排序提供一个比较器
public class StreamStudent {
public static void main(String[] args) {
// ... same code of yours ...
List<Student> students = stdList.stream().sorted(Comparator.comparing(Student::getFirstName).thenComparing(Student::getLastName)).collect(Collectors.toList());
// ... same code of yours ...
}
}
发布于 2022-06-14 06:57:18
您的学生班级应该实现Comparable
接口,以便对其进行排序:
class Student implements Comparable<Student> {
String firstName;
String lastName;
Integer groupId;
Integer age;
@Override
public int compareTo(Student o) {
return this.firstName.compareTo(o.firstName);
//In case you want compare based on multiple fields
/*
return Comparator
.comparing((Student s)->s.lastName)
.thenComparing(s->s.firstName)
.compare(this, o);
*/
}
}
另一种解决方案是为类实现比较器接口,并将其作为输入传递给排序方法,在需要在不同位置根据不同字段进行排序的情况下,这是非常有用的:
Comparator<Student> studentComparator
= Comparator.comparing(Student::getLastName).thenComparing(Student::getFirstName);
List<Student> studentsSorted = stdList.stream().sorted(studentComparator).collect(Collectors.toList());
https://stackoverflow.com/questions/72612575
复制相似问题