java - 将 Java while 循环转换为 Stream 以提高性能

标签 java stream

我有以下代码,由于必须将长流转换为数组,因此存在性能问题。 Board.getReachables() 方法返回一个流,因此能够使用流执行此 while 循环会提高性能。但是,我不确定如何继续。

 int counter = 1;
 while (check(board, counter)) {
   for (int i = 0; i < board.length; i++) {
     if (board[i] == counter) {
       for (Pos reach2 :
            Board.getReachables(currentTurn.getBoard().pos(i),
                                currentTurn.getBoard())
                 .toArray(Pos[]::new)) {
         if (board[currentTurn.getBoard().index(reach2)] == 0) {
           board[currentTurn.getBoard().index(reach2)] = counter + 1;
         }
       }
     }
   }
   counter++;
 }

最佳答案

将循环转换为流:

AtomicInteger counter = new AtomicInteger(1);
while (check(board, counter.get())) {
   for (int i = 0; i < board.length; i++) {
     if (board[i] == counter.get()) {
         Board.getReachables(currentTurn.getBoard().pos(i), currentTurn.getBoard())
         .filter(reach2 ->  board[currentTurn.getBoard().index(reach2)] == 0)
         .forEach(reach2 -> board[currentTurn.getBoard().index(reach2)] = counter.get() + 1);
     }
   }
   counter.incrementAndGet();
 }

counter 转换为 AtomicInteger,因为它是在 lambda 中引用的,因此必须是有效的最终

其他重构留给读者。

关于java - 将 Java while 循环转换为 Stream 以提高性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65871326/

相关文章:

java - 是否可以 Autowiring JDO PersistenceManager 或仅 Autowiring PersistenceManagerFactory?

java - org.openqa.selenium.NoSuchSessionException : no such session error in Selenium automation tests using ChromeDriver Chrome with Java

java - @Id 不创建主键

asynchronous - 如何仅在 Dart 中完成上一次执行后才定期调用函数?

javascript - 是否可以在浏览器中使用纯 JavaScript 保存音频流?

c# - 在asp.net和java之间共享 session 变量

Java 井字游戏 GUI

Java:写入OutputStream,然后将其用作InputStream

javascript - 当目标流发出错误事件时,我们能否以某种方式重用源流?

javascript - node.js csv如何处理不良数据