【问题标题】:Append object to list and return result in Java 8?在 Java 8 中将对象附加到列表并返回结果?
【发布时间】:2017-04-25 12:49:25
【问题描述】:

有没有一种方法可以将一个对象附加到一个列表中,并以一种功能性非命令式的方式在一行中返回结果? 如果原始列表也不应该被改变,你会怎么做? 允许使用 Java 8。

我已经知道如何在一行中连接两个列表。 (Source)

List listAB = Stream.concat(listA.stream(), listB.stream()).collect(Collectors.toList());

我也知道如何在一行中列出对象。

List listO1 = Collections.singletonList(objectA);
List listO2 = Stream.of(objectA, objectB).collect(Collectors.toList());
List listOO = Arrays.asList(objectA, objectB);

有什么比将第一行中的listB 替换为以下行的一部分更好的方法吗?

【问题讨论】:

  • 你试过 listA.clone().append(objectB) 吗?
  • @bracco23 List<T> 接口没有公开append(...) 方法,是吗?
  • 它也不暴露 clone()。
  • @JBNizet 我知道,但我没有提到它,因为假设我可以使用实际对象而不是List<T> 类型的变量,这离现实并不遥远。跨度>
  • @mxscho 你是对的,它没有,但它暴露了 add(...) 并且 JavaDoc 说添加的元素位于列表的末尾。相同的行为,不同的名称。

标签: java list java-8 java-stream


【解决方案1】:

或者:

List<Foo> updated = Stream.of(originalList, List.of(elementToAdd)).flatMap(Collection::stream).collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    您可以使用var args 并从中创建一个stream 以附加到实际liststream,例如:

    public static <T> List<T> append(List<T> list, T... args){
        return Stream.concat(list.stream(), Stream.of(args))
                .collect(Collectors.toList());
    }
    

    【讨论】:

    • 好主意,尽管...性能影响可能很大。
    • 您能否详细说明为什么这会导致性能影响。
    【解决方案3】:

    你可以使用

    List<Foo> newList = 
        Stream.concat(list.stream(), Stream.of(fooToAdd))
              .collect(Collectors.toList());
    

    Bt 我觉得这有点令人费解。争取可读性,而不是寻找单行、更晦涩的解决方案。此外,切勿像在问题中那样使用原始类型。

    【讨论】:

    • 确定原始类型。即使我发现它可能令人困惑或不寻常,我也不想夸大这个问题。我想你的回答是我现在要走的路,但我认为可能会有更好的选择。
    • 那是 3 。当然这只是一个语句,但这不是问题所在。 ;-) 2 条语句,1 行答案here。还没决定,我的回答是不是玩笑。
    • @Andreas 虽然有点好笑,但这不是玩笑。但是,通过继续抱怨其他解决方案,您迫使我编辑我的问题以匹配每个人的思维过程(一行 = 一个语句 = 功能性,而不是命令性)。我不想这样做,因为它会使您的答案无效(而且我认为我的意思很清楚)。此外,这个答案对我来说仍然不是什么新鲜事,我也在问题的中途提到了它(可能是因为没有其他好的解决方案)。我想我会再等一天再接受。
    • @mxscho 这不是投诉。这是一个观察,也就是对 JB 的评论,虽然他回答了你问题的精神,但他没有回答你问题的字母。他确实回答了,因为您问题中的代码用于连接两个列表,但您的问题是关于如何将单个元素添加到列表中,而这个答案显示了如何调整 you 显示的代码, 真正做到这一点。
    • @Andreas 我在最后一句中明确询问是否有另一种更好的方法来做这件事,而不是把我的陈述放在一起,因此这个答案并不完全是(即使从字面上理解)我正在寻找的,因为我自己基本上已经知道了。当然,我仍然不确定是否有什么能让我满意的东西。这就是为什么我首先问的原因。狡辩也对我没有帮助,我很抱歉规范不好。我既不是母语人士,也不是故意用 complain 代替 comment 来侮辱任何人。编辑它以符合我的精神。
    猜你喜欢
    • 2014-06-13
    • 2014-05-26
    • 1970-01-01
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多