【问题标题】:Coverting for loop to lambda and streams将 for 循环转换为 lambda 和流
【发布时间】:2016-10-12 05:17:29
【问题描述】:

我有这段代码,并花了一些时间尝试使用 lambda 表达式和流转换这个 for 循环,但失败了。

for(int i = 0, j = 308; i < 17;i++, j -= 18) {
            if(consoleMessages[i] != null) {
                newBoldFont.drawBasicString(consoleMessages[i], 9, j, 16777215, 0);
            }
        }

我试过这个,也试过很多其他方法,但不记得我有什么。

Arrays.stream(consoleMessages).forEach(x->{
            IntStream.range(308,0).map(inty->inty-=18).forEach(v->{
                newBoldFont.drawBasicString(x, 9, v, 16777215, 0);
                return;
            });
        });

【问题讨论】:

  • 显示您尝试过的内容。

标签: java lambda java-8 java-stream


【解决方案1】:

如果你坚持...

    IntStream.range(0, 17)
        .forEach(
            i-> {
                if(consoleMessages[i] != null)
                    newBoldFont.drawBasicString(consoleMessages[i], 9, 308 - 18 * i, 16777215, 0);
            });

...但是为什么会有人想要这样做呢?循环是完美的,它是可读的,它是可以理解的。保持代码不变。

【讨论】:

  • 使用filter 操作,Stream 代码会变得更好……
  • @Holger 是的,但是您会以这种方式失去与索引的关系。或者你知道如何保持这个吗? (除了在数组中进行搜索以确定索引或使用中间“对”对象。)
  • 我不是在说mapping,只是在过滤,.filter(i -&gt; consoleMessages[i] != null).forEach(i -&gt; newBoldFont.drawBasicString(consoleMessages[i], 9, 308 - 18 * i, 16777215, 0))...
猜你喜欢
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多