Java lambdas:将节点从列表复制到新列表

mot*_*rl2 6 java lambda filter collect java-stream

我是Java lambdas的新手,我不确定我想要的是否可以实现:我有一个对象列表,我想过滤它们以提取那些匹配给定条件的对象,并将它们放入一个单独的列表(所以我可以对它们执行一些操作,保持原始列表不被修改)我想出了这个:

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

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

所以,我想知道它是否可行实现(使用lambdas,我知道我可以用迭代所有元素的"经典"方式),在这种情况下,如何实现.提前致谢!

Jer*_*and 5

假设你的建议有点拥有一个public Suggestion copy();方法(比如实现一个Copyable<Suggestion>接口),你可以这样做:

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

编辑:使用复制构造函数:

List<Suggestion> only_translations = original_list.stream()
    .filter(t -> t.isTranslation)
    .map(t -> new Suggestion(t))  // or .map(Suggestion::new)
    .collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

  • 这可以分别缩写为`Suggestion :: copy`或`Suggestion :: new`. (3认同)