将 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种
- 引用静态方法 - ContainingClass::staticMethodName
- 引用特定的实例方法
对象 - containingObject::instanceMethodName
- 对实例的引用
特定对象的任意对象的方法
输入 - ContainingType::methodName
- 参考一个
构造函数 - ClassName::new
回到你的问题:
.map(其他::setDefaultDataStore);
您不应该使用 map 函数对流成员执行一些辅助操作,它用于将流转换为另一个流。改为用户 foreach
getWorkspaces().stream()
.map(this::getDefaultDataStore)
.filter(Objects::nonNull)
.foreach(other::setDefaultDataStore);
有人可以帮我转换以下代码以使用方法引用吗?我正在努力思考这个新语法,但当它变得比映射到单个方法调用的单个变量更复杂时,我很快就迷路了:
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种
- 引用静态方法 - ContainingClass::staticMethodName
- 引用特定的实例方法 对象 - containingObject::instanceMethodName
- 对实例的引用 特定对象的任意对象的方法 输入 - ContainingType::methodName
- 参考一个 构造函数 - ClassName::new
回到你的问题: .map(其他::setDefaultDataStore);
您不应该使用 map 函数对流成员执行一些辅助操作,它用于将流转换为另一个流。改为用户 foreach
getWorkspaces().stream()
.map(this::getDefaultDataStore)
.filter(Objects::nonNull)
.foreach(other::setDefaultDataStore);