使用比较器对VO的嵌套列表进行排序

时间:2019-07-26 10:29:56

标签: java spring lambda java-8 java-stream

我正在尝试使用比较器对嵌套的VO进行排序。我可以使用集合排序来做到这一点,但是intellij显示警告,我们必须使用比较器。但是当我们有带有嵌套对象的对象列表时,我无法弄清楚这种用法。

  

报告比较器定义为lambda表达式,可以使用诸如Comparator.comparing()之类的方法来表示。一些比较器   像(person1,person2)->   person1.getName()。compareTo(person2.getName())可以简化   像这样:Comparator.comparing(Person :: getName)。还建议   用Comparator.thenComparing()替换链比较,例如整型   res = o1.first.compareTo(o2.first); if(res == 0)res =   o1.second.compareTo(o2.second); if(res == 0)res = o1.third-   o2。第三;返回资源;将被替换为   objs.sort(Comparator.comparing((Obj o)-> o.first).thenComparing(o->   o.second).thenComparingInt(o-> o.third));

这是我的课程

public class SortBaseVO {

public SortBaseVO(String prop1, String prop2, String prop3, String prop4, String sortBaseVO2) {
    this.prop1 = prop1;
    this.prop2 = prop2;
    this.prop3 = prop3;
    this.prop4 = prop4;
    this.sortBaseVO2 = sortBaseVO2;
}

private String prop1;

private String prop2;

private String prop3;

private String prop4;

private String sortBaseVO2;

public String getSortBaseVO2() {
    return sortBaseVO2;
}

public void setSortBaseVO2(String sortBaseVO2) {
    this.sortBaseVO2 = sortBaseVO2;
}

public String getProp1() {
    return prop1;
}

public void setProp1(String prop1) {
    this.prop1 = prop1;
}

public String getProp2() {
    return prop2;
}

public void setProp2(String prop2) {
    this.prop2 = prop2;
}

public String getProp3() {
    return prop3;
}

public void setProp3(String prop3) {
    this.prop3 = prop3;
}

public String getProp4() {
    return prop4;
}

public void setProp4(String prop4) {
    this.prop4 = prop4;
}

}

B级

public class SortBaseVO2 {


    private String a;

    private String b;

    private String c;

    private String d;

    public String getA() {
        return a;
    }

    public void setA(String a) {
        this.a = a;
    }

    public String getB() {
        return b;
    }

    public void setB(String b) {
        this.b = b;
    }

    public String getC() {
        return c;
    }

    public void setC(String c) {
        this.c = c;
    }

    public String getD() {
        return d;
    }

    public void setD(String d) {
        this.d = d;
    }

}

当前排序已完成,sortBaseVOList是sortBaseVO的列表

Collections.sort(sortBaseVOList , (sortBaseVO1, sortBaseVO2) ->
        sortBaseVO1.getsortBaseVO2().getB().concat(sortBaseVO1.getsortBaseVO2().getD())
        .compareTo(sortBaseVO2.getsortBaseVO2().getB().concat(sortBaseVO2.getsortBaseVO2().getD()));

我可以更改它以使用比较器吗?

2 个答案:

答案 0 :(得分:0)

我模拟了您的问题。

我建议采用以下替代方法作为纠正此警告的正确方法:

List<SortBaseVO> sortBaseVOList = new ArrayList<>();
Collections.sort(sortBaseVOList , Comparator.comparing(SortBaseVO::getConcat));

您必须在SortBaseVO类中的以下位置定义以下方法:

public class SortBaseVO {

    // all other methods

    public String getConcat() {
        return getSortBaseVO2().getB().concat(getSortBaseVO2().getD());
    }
}

答案 1 :(得分:0)

  Collections.sort(list,
        Comparator.comparing(sbVO -> sbVO.getSortBaseVO2().getB().concat(sbVO.getSortBaseVO2().getD())));

如果您按“ alt + Enter”,然后单击“用比较器替换”,则可以获得相同的答案。