【问题标题】:How to add incremental value inside Instream or list stream?如何在 Instream 或列表流中添加增量值?
【发布时间】:2017-04-18 19:38:10
【问题描述】:

如何在 IntStream 或列表流中添加增量值?

List<TestInstance> testInstances = IntStream.range(0, rankedItem.size())
                .mapToObj(i -> TestInstance.fromItem(rankedItem.get(i), filteredItems.containsKey(rankedItem.get(i).getItem().getId())))
                .collect(Collectors.toList());

        int rank = MIN_RANK_VALUE;
        for (TestInstance testInstance : testInstances) {
            testInstance.getRank().put(rankerName, rank++);
        }

现在我在 2 个 for 循环中执行此操作。有什么办法可以在一次迭代中完成吗?

【问题讨论】:

  • 您可以使用AtomicInteger 及其getAndIncrement 方法。您没有使用它的原子性(除非您使用并行流),但它的其他优点使它适合您的目的。

标签: java list for-loop java-8 java-stream


【解决方案1】:

由于您尝试设置的排名是按照初始列表中项目的顺序排列的,它们等于MIN_RANK_VALUE + 列表中的位置,因此您可以简单地重用i 来计算排名:

List<TestInstance> testInstances = IntStream.range(0, rankedItem.size())
    .mapToObj(i -> {
        TestInstance t = TestInstance.fromItem(rankedItem.get(i), filteredItems.containsKey(rankedItem.get(i).getItem().getId()));
        t.getRank().put(rankerName, MIN_RANK_VALUE + i);
        return t;
    })
.collect(Collectors.toList());

理想情况下,您可以修改 fromItem() 以将排名作为参数,这样您就可以为 lambda 保留一行。

【讨论】:

  • 它给了我一个错误,说 List 中的 get(int) 不能应用于 rankItem.get(i) 的 ()
  • @user3407267 缺少},也许可以解决它?由于您没有提供完整的代码,我无法真正对其进行测试。
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 2022-06-10
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多