我对Java lambda很陌生,我不确定我想要的东西是否可以实现:
我有一个对象列表,我想对其进行过滤以提取与给定条件匹配的对象,然后将它们放在单独的列表中(这样我就可以对它们执行一些操作,而使原始列表保持不变)
我想出了这个:

  List<Suggestion> only_translations = original_list.stream().
    filter(t -> t.isTranslation).
    collect(Collectors.toCollection(() -> new ArrayList<Suggestion>()));

但是,即使我得到一个新的列表对象,这些节点似乎也链接到原始节点(通过引用,而不是从原始列表中复制的新对象),因此,修改新列表中的对象也会同时修改节点中的对象。原来的一个。

因此,我想知道是否有可能实现这一目标(使用lambda,我知道我可以用“经典”方式迭代所有元素),在这种情况下,如何实现。
提前致谢!

最佳答案

假设您的建议在某种程度上具有public Suggestion copy();方法(例如实现Copyable<Suggestion>接口(interface)),则可以执行以下操作:

List<Suggestion> only_translations = original_list.stream()
    .filter(t -> t.isTranslation)
    .map(t -> t.copy())       // or .map(Suggestion::copy)
    .collect(Collectors.toList()));

编辑:与复制构造函数:
List<Suggestion> only_translations = original_list.stream()
    .filter(t -> t.isTranslation)
    .map(t -> new Suggestion(t))  // or .map(Suggestion::new)
    .collect(Collectors.toList()));

10-08 20:10