【问题标题】:Replace for-each loop with lambda expression用 lambda 表达式替换 for-each 循环
【发布时间】:2018-04-24 16:45:26
【问题描述】:

我只是重构我的一些旧项目以使用 Java 8 的功能。

int counter = 1;
for (Checker checker : checkers) {
    if (counter < checkers.size()) {
        checker.setNextChecker(checkers.get(counter++));
    }
}

这是一种连锁反应模式。而且我需要为列表中的每个检查器设置下一个检查器,不包括最后一个。

这里仍然找不到使用 Stream API 的方法:)

【问题讨论】:

  • 我会留下一个 for 循环。更好的可读性,我认为这里没有流的优势。
  • @lexicore 在可读性方面是否更好stackoverflow.com/questions/50006972/…
  • @Aominè 我真的不明白为什么它应该比简单的for-loop 更好。
  • @lexicore 好声音,我想我更专注于使用 OP 要求的流。
  • @Aominè 你说的完全正确,这是 OPs 的问题,你给出了很好的答案。

标签: java foreach java-8 java-stream


【解决方案1】:

使用IntStream.range

IntStream.range(1, checkers.size())
         .forEach(i -> checkers.get(i-1).setNextChecker(checkers.get(i)));

或使用 for 循环:

for (int i = 1; i < checkers.size(); i++) 
      checkers.get(i-1).setNextChecker(checkers.get(i));

【讨论】:

  • 也可以在没有get(i)的情况下编写for-loop。
  • @lexicore 我假设您的意思是 for-each 循环或也称为 enhanced for 循环 ?如果是这样,那不会使事情的可读性降低一点比当前的 for 循环?
  • 谢谢,这是我一直在寻找的东西)我同意,Stream API 不是这里的最佳选择,但我无法快速找到该解决方案,所以我在这里问了这个问题。跨度>
【解决方案2】:

一个疯狂的选择:

Iterator<Checker> currentIt = checkers.subList(0, checkers.size() - 1).iterator();
Iterator<Checker> nextIt = checkers.subList(1, checkers.size()).iterator();
while (currentIt.hasNext()) {
  currentIt.next().setNextChecker(nextIt.next());
}

我猜你也可以用一个迭代器来写它:

Iterator<Checker> it = checkers.iterator();
Checker previous = it.next();
while (it.hasNext()) {
  previous.setNextChecker(previous = it.next());
}

但假设您的列表很小,并且RandomAccess,我会坚持使用基于索引的循环:

for (int i = 0; i < checker.size()-1; ++i) {
  checkers.get(i).setNextChecker(checkers.get(i+1));
}

流在这里并不是真正的好处。

【讨论】:

  • previous.setNextChecker(previous = it.next()); 看起来也很疯狂 :)
  • @user7 是的,这太令人困惑了,我不得不尝试它来说服自己它会正确评估。
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2016-02-14
  • 2022-01-23
  • 2015-10-06
  • 1970-01-01
相关资源
最近更新 更多