java.lang.ClassCastException 带有流排序和自定义比较器
java.lang.ClassCastException with stream sorting and custom comparator
我正在使用 java 版本 1.8,它支持 lambda 表达式。
我正在尝试通过自定义比较器对流进行排序,但我收到了 ClassCastxception:
public class A {
private String type;
private String ip;
private String originSubId;
public A(String type, String ip, String originSubId) {
this.type = type;
this.ip = ip;
this.originSubId = originSubId;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getOriginSubId() {
return originSubId;
}
public void setOriginSubId(String originSubId) {
this.originSubId = originSubId;
}
}
Comparator<A> defaultComparator = Comparator.comparing(A::getType)
.thenComparing(A::getIp).thenComparing(A::getOriginSubId);
Set<A> entities = new HashSet<>();
entities.stream().map(e -> convertToB(e)).sorted(defaultComparator)
.collect(Collectors.toCollection(TreeSet::new));
错误:
java.lang.ClassCastException: A 无法转换为 java.lang.Comparable
我做错了什么?
您不能像那样收集到“普通”TreeSet
,因为它要求元素要么是 Comparable
,要么 TreeSet
获得自定义 [=15= 】 关于创作。您也不需要在流中排序,因为 TreeSet
在插入时执行排序。您的 convertToA()
方法看起来也很可疑,它是否正在转换 A
-> A
?
您需要如下内容
entities.stream().map(e -> convertToA(e))
.collect(Collectors.toCollection(() -> new TreeSet(customComparator)));
如果不需要您的转换方法,您可以忘记整个流并执行
Set<A> tree = new TreeSet<>(customComparator);
tree.addAll(entities);
我正在使用 java 版本 1.8,它支持 lambda 表达式。
我正在尝试通过自定义比较器对流进行排序,但我收到了 ClassCastxception:
public class A {
private String type;
private String ip;
private String originSubId;
public A(String type, String ip, String originSubId) {
this.type = type;
this.ip = ip;
this.originSubId = originSubId;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getOriginSubId() {
return originSubId;
}
public void setOriginSubId(String originSubId) {
this.originSubId = originSubId;
}
}
Comparator<A> defaultComparator = Comparator.comparing(A::getType)
.thenComparing(A::getIp).thenComparing(A::getOriginSubId);
Set<A> entities = new HashSet<>();
entities.stream().map(e -> convertToB(e)).sorted(defaultComparator)
.collect(Collectors.toCollection(TreeSet::new));
错误: java.lang.ClassCastException: A 无法转换为 java.lang.Comparable
我做错了什么?
您不能像那样收集到“普通”TreeSet
,因为它要求元素要么是 Comparable
,要么 TreeSet
获得自定义 [=15= 】 关于创作。您也不需要在流中排序,因为 TreeSet
在插入时执行排序。您的 convertToA()
方法看起来也很可疑,它是否正在转换 A
-> A
?
您需要如下内容
entities.stream().map(e -> convertToA(e))
.collect(Collectors.toCollection(() -> new TreeSet(customComparator)));
如果不需要您的转换方法,您可以忘记整个流并执行
Set<A> tree = new TreeSet<>(customComparator);
tree.addAll(entities);