Java8将对象列表转换为对象的一个属性列表

15

我希望使用Java 8的技巧在一行代码中完成以下操作。

假设有如下对象定义:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MyObj {
    private String id;
    private Double value;
}

给定一个 List<MyObj> 对象,我想要获取一个 List<String> objectIds,其中包含第一个列表中所有对象的 id 列表 - 以相同的顺序。

我可以在Java中使用循环来实现这一点,但我相信在Java8中应该有一个一行代码的lambda可以做到这一点。我找不到在线解决方案。也许是我没有使用正确的搜索术语。

是否有人可以建议一个lambda或另一个一行代码的转换方法?

List<String> objectIds = objects.stream().map(MyObj::getId).collect(Collectors.toList());


搜索条件不是“lambda”,而是“流 API”。这里有很多类似的答案。 - pvg
1
所有这些注释是什么?GetterSetter - user2357112
1
那是来自Lombok吗? - Grzegorz Górkiewicz
1
@user2357112:那是Lombok的注解。现在非常普遍。 - Nik
1个回答

34

这个应该会起作用:

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

话虽如此,方法引用::操作符允许您引用类路径中的任何方法,并将其用作所需操作的lambda。

正如评论中提到的,流保留顺序。


我首先使用 `objects.sort((o1, o2) -> (int) - Nik
1
根据此 https://dev59.com/gF4b5IYBdhLWcg3wYQqZ#29218074,似乎在列表中顺序是有保证的。 - xiumeteo
4
@Nik,这个比较器最好写成 objects.sort(Comparator.comparingInt(MyObj::getValue))。但是,是的,顺序是有保证的。 - Louis Wasserman
@LouisWasserman:谢谢。我一直想知道为什么没有更好的比较器适用于“double”。从现在开始,我将在所有排序中使用它。 - Nik
@LouisWasserman:跟进一下。我该如何确保比较器中的降序排序?我相信默认情况下它会按升序排序,对吗? - Nik
3
comparingInt(MyObj::getValue()).reversed() - Louis Wasserman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接