我将以下代码转换为 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/