使用Java 8的更好方法

Sau*_*mar 3 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);
      }
    }
Run Code Online (Sandbox Code Playgroud)

Java8

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

任何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;
}
Run Code Online (Sandbox Code Playgroud)

Tag*_*eev 5

你的解决方案没问题,只是平行映射到并行流是没用的.如果你看一下flatMapOpenJDK/OracleJDK中的实现,你会发现通过传入lambda创建的流flatMap会立即变为顺序模式.所以,你不会有任何并行性和它的更好,以取代parallelStream()stream()避免混淆.如果您真的想要并行化工作,通常最好只并行化最外层的流.