【发布时间】:2019-07-26 10:29:56
【问题描述】:
我正在尝试使用比较器对嵌套的 VO 进行排序。我可以使用集合排序来做到这一点,但 intellij 显示警告我们必须使用比较器。但是当我们有包含嵌套对象的对象列表时,我无法理解这种用法。
报告比较器定义为 lambda 表达式,可以使用 Comparator.comparing() 等方法表示。一些比较器 喜欢 (person1, person2) -> person1.getName().compareTo(person2.getName()) 可以简化 像这样:Comparator.comparing(Person::getName)。还建议 用 Comparator.thenComparing() 替换链比较,例如整数 res = o1.first.compareTo(o2.first);如果(资源 == 0)资源 = 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()));
我可以将其更改为使用 Comparator 吗?
【问题讨论】:
-
不确定我是否正确理解了这个问题。如果不想在 Collections.sort() 中定义比较器,则必须通过 VO 类实现 Comparable
接口。 -
某些类型在您的示例中定义错误。例如,属性 SortBaseVO#sortBaseVO2 被定义为 String,但我来宾说类型应该是 SortBaseVO2。
标签: java spring lambda java-8 java-stream