我对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()));