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