按包含对象中的字段对对象列表进行排序

Sort the list of objects by the field in included object

我想根据 ElementWithDistance class 中的距离对 potentialHS 对象列表进行排序,但我无法以这种方式获取 distnace 字段。调用 getElementWithDistance 后,我无法调用 getDistance。如何按包含的字段对列表进行排序 class?

List<PotentialHS> potentialHS = potentialHS.stream().sorted(Comparator.comparingDouble(PotentialHS :: getElementWithDistance)).collect(Collectors.toList());

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@ToString
public class PotentialHS {
    private Integer density;
    private Double startDistance;
    private Double lastDistance;
    private List<PMValue> pmv;
    private ElementWithDistance elementWithDistance;
}

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@ToString
public class ElementWithDistance  {
    private Long elementId;
    private Double distance;
    private Type type;
}
PotentialHS :: getElementWithDistance

是 shorthand 用于:

(PotentialHS x) -> x.getElementWithDistance()

换句话说,它说:要对这个流进行排序,应用以下操作:

  • 流中的每个项目,通过调用 getElementWithDistance() 获取您获得的东西。将其视为双精度数,然后按这些双精度数排序。

这显然行不通 - ElementWithDistance 不是双数。

你想要:

(PotentialHS x) -> x.getElementWithDistance().getDistance();

还要注意它是 Double,而不是 double,所以这是一个错误(修复它。Double 是围绕 [=17= 的非原始包装类型],你真的不想要它。它有额外的价值(null),而且效率极低。这也意味着你不能做像 'give me the largest double in this stream'.

这样的事情

这让你:

List<PotentialHS> potentialHS = potentialHS.stream().sorted(Comparator.comparingDouble(x -> x.getElementWithDistance().getDistance())).collect(Collectors.toList());