【问题标题】:Copy List elements N times using Stream API使用 Stream API 复制列表元素 N 次
【发布时间】:2019-04-03 11:05:08
【问题描述】:

有没有办法在 Java 中使用 Stream API 复制一些列表(或必要的组合字符串)N 次

如果列表由{"Hello", "world"} 和N = 3 组成,则结果应为{"Hello", "world", "Hello", "world", "Hello", "world"}

到目前为止,我所做的是获取组合的 String 元素,但我不确定如何将其复制 N 次。虽然我可以在外部完成,但我想看看是否可以在流的帮助下完成

Optional<String> sentence = text.stream().reduce((value, combinedValue) -> { return value + ", " + combinedValue ;});

我想使用流,因为我打算在上述操作之后继续进行其他流操作

【问题讨论】:

  • 你给出的代码最好换成String.join(", ", text)
  • @RealSkeptic 你是对的,只是我想使用流,因为我打算在问题中提出的操作之后继续进行其他流操作
  • 您应该在问题中指定。人们给你的答案假设你想要某种最终产品,要么是列表,要么是字符串。
  • @RealSkeptic 我相信我在问题中指定了它,但会尝试对其进行编辑以使其更清晰,谢谢

标签: java list java-stream


【解决方案1】:

你可以使用Collections.nCopies:

List<String> output =
    Collections.nCopies(3,text) // List<List<String>> with 3 copies of 
                                // original List
               .stream() // Stream<List<String>>
               .flatMap(List::stream) // Stream<String>
               .collect(Collectors.toList()); // List<String>

这将产生List

[Hello, World, Hello, World, Hello, World]

用于您的示例输入。

【讨论】:

    【解决方案2】:

    您可以使用IntStreamflatMap 多次连接text 列表:

    List<String> result = IntStream.range(0, 3)
            .mapToObj(i -> text)
            .flatMap(List::stream)
            .collect(Collectors.toList());
    

    结果如下:

    [Hello, World, Hello, World, Hello, World]
    

    【讨论】:

    • 通过将.boxed() .flatMap(i -&gt; text.stream()) 替换为.mapToObj(i -&gt; text) .flatMap(List::stream) 来避免装箱
    • 我为什么要避免使用.boxed()?你能再解释一下吗?
    • 它不适用于这个小范围的简单场景,但对于大范围,.boxed() 意味着可能为每个元素(字节范围之外)创建一个新的 Integer 实例,而.mapToObj(i -&gt; text) 总是映射到同一个已经存在的对象。并不是说您应该不惜一切代价避免拳击,但是在这里,替代方案具有相同的简单性,所以为什么不使用它(然后,它将与the accepted answer 的幕后发生的事情相提并论)
    • 感谢@Holger 的解释。我更新了我的答案。
    猜你喜欢
    • 2020-11-19
    • 2014-08-05
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2016-01-07
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多