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,它是第一个列表中所有ids 对象的列表 - 顺序相同。

我可以在 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:谢谢。我总是想知道为什么没有更好的比较器可用于doubles。今后将在我的各种用途中使用它。 comparingInt(MyObj::getValue()).reversed()

以上是关于Java8将对象列表转换为对象的一个​​属性列表的主要内容,如果未能解决你的问题,请参考以下文章

通过流将带有列表的列表对象转换为Java 8中的映射[重复]

将对象的属性转换为逗号分隔的列表?

如何将列表列表转换为 Java 8 中的列表?

Java 8 流:迭代列表映射

C# - 将对象列表转换为包含多个对象属性的数组

使用流将对象列表转换为从 toString 方法获得的字符串