Java8将对象列表转换为对象的一个属性列表
Posted
技术标签:
【中文标题】Java8将对象列表转换为对象的一个属性列表【英文标题】:Java8 Transform list of object to list of one attribute of object 【发布时间】:2017-07-07 10:17:57 【问题描述】:我想使用 Java 8 技巧在一行中完成以下操作。
给定这个对象定义:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MyObj
private String id;
private Double value;
还有一个List<MyObj> objects
,我想得到一个List<String> objectIds
,它是第一个列表中所有id
s 对象的列表 - 顺序相同。
我可以在 Java 中使用循环来做到这一点,但我相信 Java8 中应该有一个单行 lambda 可以做到这一点。我无法在网上找到解决方案。也许我没有使用正确的搜索字词。
有人可以为这种转换建议一个 lambda 或其他单线吗?
【问题讨论】:
搜索词不是“lambda”而是“stream api”。这里有很多类似的答案。 这些注释是什么?Getter
? Setter
?
是龙目岛的吗?
@user2357112:这是Lombok
的注释。这些天很常见。
【参考方案1】:
这应该可以解决问题:
objects.stream().map(MyObj::getId).collect(Collectors.toList());
也就是说,方法引用 ::
运算符允许您引用类路径中的任何方法并将其用作所需操作的 lambda。
如 cmets 中所述,流保持顺序。
【讨论】:
我首先使用objects.sort((o1, o2) -> (int) (o1.getValue()-o2.getValue()))
以value
的降序排列列表。然后我只需要提取 objectIds 以传递到另一个函数而不更改顺序。如果这种方法不能保证顺序,那我不能冒险使用它。
根据这个***.com/a/29218074/539864 似乎可以保证列表中的顺序
@Nik 比较器写得更好objects.sort(Comparator.comparingInt(MyObj::getValue))
。但是,是的,订单是有保证的。
@LouisWasserman:谢谢。我总是想知道为什么没有更好的比较器可用于double
s。今后将在我的各种用途中使用它。
comparingInt(MyObj::getValue()).reversed()
以上是关于Java8将对象列表转换为对象的一个属性列表的主要内容,如果未能解决你的问题,请参考以下文章