将 lambda 转换为方法引用

Convert lambdas to method references

有人可以帮我转换以下代码以使用方法引用吗?我正在努力思考这个新语法,但当它变得比映射到单个方法调用的单个变量更复杂时,我很快就迷路了:

getWorkspaces().stream().forEach((ws) -> {
            DataStoreInfo defaultDataStore = getDefaultDataStore(ws);
            if (defaultDataStore != null) {
                other.setDefaultDataStore(ws, defaultDataStore);
            }
        });

我从这个开始,但它不起作用:)

getWorkspaces().stream()
               .map(this::getDefaultDataStore)
               .filter(Objects::nonNull)
               .map(other::setDefaultDataStore);

编辑:"it doesn't work",我的意思是 IDE 在 "setDefaultDataStore" 下的最后一行抱怨它无法解析该方法。我希望我能从一些有用的东西开始,但我不知道如何到达那里。我对如何使用方法引用来调用采用 2 个参数的方法以及如何映射它感到非常困惑。我已经转换了一些看起来像这样的代码:

 getMaps().stream().forEach((m) -> {
            other.add(m);
        });

对此:

getMaps().forEach(other::add);

但是当它变得更复杂时我迷路了。我希望有一个关于如何使用方法引用编写相同代码的明显解决方案。

您可以像这样将您的代码转换为 lambda 版本,但它并不像预期的那样干净。

words.stream().map(ws -> new SimpleImmutableEntry<>(ws, getDefaultDataStore(ws)))
              .filter(e -> e.getValue() != null)
              .forEach(e -> setDefaultDataStore(e.getKey(), e.getValue()));

注意:e 是 entry 的缩写。

您可以在这里阅读很多关于方法引用的有用信息 https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

如果您的 lambda 只调用现有方法,您可以将其替换为方法引用。因此,如果您熟悉 lambda,您将轻松应对方法引用。

有4种

  1. 引用静态方法 - ContainingClass::staticMethodName
  2. 引用特定的实例方法 对象 - containingObject::instanceMethodName
  3. 对实例的引用 特定对象的任意对象的方法 输入 - ContainingType::methodName
  4. 参考一个 构造函数 - ClassName::new

回到你的问题: .map(其他::setDefaultDataStore);

您不应该使用 map 函数对流成员执行一些辅助操作,它用于将流转换为另一个流。改为用户 foreach

getWorkspaces().stream()
               .map(this::getDefaultDataStore)
               .filter(Objects::nonNull)
               .foreach(other::setDefaultDataStore);