【问题标题】:Java Stream - How to add counter i to nth value of the stream [duplicate]Java Stream-如何将计数器i添加到流的第n个值[重复]
【发布时间】:2016-11-29 08:06:46
【问题描述】:

如何在迭代 Stream 时将计数器值添加到每个第 n 个项目?

这是我最简单的代码:

Stream.of("a1","a2","a3")
    .map(x -> x + "counterValue")
    .findFirst()
    .ifPresent(System.out::println);

当我在每个 nth 项目中添加“counterValue”字符串时,我想要实现的是在每个第 n 个元素中添加 ith 值。

当前程序的输出为a1counterValue

我希望输出为a10。 0 表示该元素的索引。

有人可以帮忙吗?

【问题讨论】:

  • 第 i 个值是多少?
  • 至少对我来说还不是很清楚,你想要实现什么。你能举个例子说明输入和期望的输出吗?
  • stackoverflow.com/q/18552005/3788176 最简单的方法是遍历索引流,然后您可以计算“每第 n 个项目”。但这取决于您的流的来源,您是否可以通过索引引用它的元素,或者您是否需要将两个流压缩在一起。
  • @AndyTurner 我之前检查过这个链接。但我不想使用 IntStream.range...
  • 您需要索引,因此如果您不想使用共享的可变值,您将需要类似Intstream.range 的东西来跟踪索引。

标签: java java-8 java-stream counter


【解决方案1】:

这是你要找的吗?

 List<String> input = Arrays.asList("one", "two");
 IntStream.range(0, input.size())
      .mapToObj(i -> input.get(i) + i)
      .collect(Collectors.toList()) // [one0, two1]

【讨论】:

  • 有没有不使用 IntStream.range 的替代方案?
  • @KaranVerma 当你在 Steam 上进行内部迭代时,你是在迭代它的元素,而不是索引。流一般对索引没有概念,所以答案是:不,没有其他办法。
  • @KaranVerma 你知道如果它真的对你有帮助你可以接受答案吗?
【解决方案2】:

您可以通过使用IntStream 来使用索引进行迭代,如下所示:

String[] arr = {"a1","a2","a3"};
int lentgh = arr.length;
IntStream.of(0, lentgh).
    mapToObj(((int i) -> i + arr[i])).findFirst().
     ifPresent(System.out::println);

【讨论】:

  • 不需要额外的大括号。你可以简单地使用mapToObj(i -&gt; i + arr[i])
猜你喜欢
  • 1970-01-01
  • 2023-03-20
  • 2017-01-12
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2019-02-19
  • 2019-02-14
  • 1970-01-01
相关资源
最近更新 更多