2017-02-17 145 views
1

我想使用Java 8技巧在一行中执行以下操作。Java8将对象列表转换为对象的一个​​属性列表

鉴于此对象定义:

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

List<MyObj> objects,我希望得到一个List<String> objectIds这是所有id S IN的第一列表中的对象的列表 - 以相同的顺序。

我可以在Java中使用循环来做到这一点,但我相信Java8中应该有一个可以做到这一点的单线程lambda。我无法在网上找到解决方案。也许我没有使用正确的搜索条件。

有人可能会建议一个lambda或另一个班轮这个变换?

+0

这个搜索条件不是'lambda',而是'stream api'。这里有很多答案。 – pvg

+0

这些注释是什么? 'Getter'? 'Setter'? – user2357112

+0

来自龙目岛吗? –

回答

5

这应该做的伎俩:

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

中说,方法参考::运营商允许引用在类路径中的任何方法,并用它作为你需要的操作拉姆达。

正如评论中所述,流保留了订单。

+0

我首先使用'objects.sort((o1,o2) - >(int)(o1.getValue() - o2.getValue()))'''按'value'的降序排列列表。然后,我需要仅提取objectIds以传递到另一个函数而不更改顺序。如果这种方法不能保证订单,那么我不能冒险使用它。 – Nik

+1

根据这个http://stackoverflow.com/a/29218074/539864它似乎在列表中的顺序是有保证的 – xiumeteo

+3

@Nik比较器写得更好'objects.sort(Comparator.comparingInt(MyObj :: getValue))''。但是,是的,订单是有保证的。 –

相关问题