java - 使用 Java 8 的更好方法

标签 java java-8 java-stream

我将以下代码转换为 java 8 代码。我想知道我是否做得正确,或者还有其他一些好方法。

Java 7

for (final Category category : categories) {
      final List<Category> subCategories = getCategories(category);
      if (subCategories != null) {
        currentLevel.addAll(subCategories);
      }
    }

Java8

categories.stream().map(category -> getCategories(category)).filter(list->list!=null).flatMap(cat -> cat.parallelStream()).collect(Collectors.toList())

将以下代码解成紧凑形式的任何 java 8 方法。

while (CollectionUtils.isNotEmpty(currentLevel)) {
  for (final Iterator<Category> iterator = currentLevel.iterator(); iterator.hasNext();) {
    final Category category = iterator.next();
    if (result == null) {
      result = new HashSet<Category>();
    }
    if (!result.add(category)) {
      // avoid cycles by removing all which are already found
      iterator.remove();
    }
  }

  if (currentLevel.isEmpty()) {
    break;
  }
  final Collection<Category> nextLevel = getAllSubcategories(currentLevel);
  currentLevel = nextLevel;
}

最佳答案

你的解决方案是好的,除了平面映射到并行流是无用的。如果你看看flatMap在 OpenJDK/OracleJDK 中的实现,你可以看到通过传入 flatMap 的 lambda 创建的流立即变成了顺序模式。所以你不会有任何并行性,最好将 parallelStream() 替换为 stream() 以避免混淆。如果您真的想并行化工作,通常最好只并行化最外层的流。

关于java - 使用 Java 8 的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37712402/

相关文章:

java - 在 Java Stream 中重用相同的值

java - 如何从矩阵访问 JButton

JavaFX、场景生成器 (IntelliJ) 程序从 StackOverFlow 抛出 java.lang.reflect.InitationTargetException

java - 我应该在 Java 中用什么替换小结构?

java - 如何在 Apache FOP 2.3 中将字体呈现为形状

Java 8 : How to find kth smallest, 高效

java - 使用数据库 mysql 中的数据在 java netbeans 中创建矩形

java - 如何将一个函数作为参数传递给另一个函数

java - 8 之前的 Java 版本怎么会不支持闭包呢?

java - Peek() 真正地看到元素流过管道中的某个点