我正在使用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:不能强制转换为java.lang.Comparable
我做错了什么?
答案 0 :(得分:1)
您不能像这样将其收集到“普通” TreeSet
,因为它要求元素要么为Comparable
,要么为TreeSet
获得自定义Comparator
创建。您也不需要在流中排序,因为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);