【问题标题】:Java8 Transform list of object to list of one attribute of objectJava8将对象列表转换为对象的一个​​属性列表
【发布时间】: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 的注释。这些天很常见。

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


【解决方案1】:

这应该可以解决问题:

objects.stream().map(MyObj::getId).collect(Collectors.toList());

也就是说,方法引用 :: 运算符允许您引用类路径中的任何方法并将其用作所需操作的 lambda。

如 cmets 中所述,流保持顺序。

【讨论】:

  • 我首先使用objects.sort((o1, o2) -> (int) (o1.getValue()-o2.getValue()))value 的降序排列列表。然后我只需要提取 objectIds 以传递到另一个函数而不更改顺序。如果这种方法不能保证顺序,那我不能冒险使用它。
  • 根据这个stackoverflow.com/a/29218074/539864 似乎可以保证列表中的顺序
  • @Nik 比较器写得更好objects.sort(Comparator.comparingInt(MyObj::getValue))。但是,是的,订单是有保证的。
  • @LouisWasserman:谢谢。我总是想知道为什么没有更好的比较器可用于doubles。今后将在我的各种用途中使用它。
  • comparingInt(MyObj::getValue()).reversed()
猜你喜欢
  • 2021-11-02
  • 2019-12-16
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
相关资源
最近更新 更多