具有流排序和自定义比较器的java.lang.ClassCastException

时间:2020-11-10 09:33:59

标签: java lambda 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:不能强制转换为java.lang.Comparable

我做错了什么?

1 个答案:

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