java - 如何将 "nested for each"转换为 Java 8 Lambda/Stream 构造?

标签 java lambda collections java-8 java-stream

如何转换以下代码块:

List<ExecutableElement> methods = ...
List<ExecutableElement> hiddens = new ArrayList<>();
for (ExecutableElement hider : methods) {
  for (ExecutableElement hidden : methods) {
    if (elements.hides(hider, hidden) || elements.overrides(hider, hidden, type)) {
      hiddens.add(hidden);
    }
  }
}
methods.removeAll(hiddens);

进入类似:

methods.removeAll(methods.stream().filter(... ...().collect(Collectors.toList());

最佳答案

flatMap 应该可以解决问题:

对于每个 ExecutableElement,迭代所有 ExecutableElement 并找到其隐藏的所有元素,然后通过 flatMap 将所有这些流折叠为单个流,将其收集到列表,并删除所有隐藏元素。

methods.removeAll(
    methods.stream ()
           .flatMap (hider -> methods.stream()
                                     .filter (hidden -> elements.hides(hider, hidden) || 
                                                        elements.overrides(hider, hidden, type))
                    )
           .collect(Collectors.toList())
);

关于java - 如何将 "nested for each"转换为 Java 8 Lambda/Stream 构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25221114/

相关文章:

java.lang.ClassNotFoundException : com/microsoft/sqlserver/jdbc/SQLServerDriver

java - 在java中访问嵌套的elasticsearch字段

Java 集合排序 : Comparison method violates its general contract

c# - 如何在 lambda 表达式中使用 IDisposable?

javascript - 如何将 JS 对象集合发送到 ASP.NET API 服务?

java - Lambda 表达式将对象从一个列表添加到另一种类型的列表

java - 连接android时socket.io发送一些数据到服务器

java - 在 Objectify 中计算实体的排名

c++ - lambda 函数中的临时捕获变量 - C++11

c# - 如何使用编译后的 lambda 函数对运行时生成的类型进行分组