我正在寻找一种方法来执行可能产生副作用的任务。
我想要完成的是以下内容:
getOptionalHumanObject()
.map((Human h1) -> human::getName)
.do((String name) -> System.out::printLn)
.do((String name) -> invokeImportentHttpPostRequest(x))
.map((String name) -> name.length())
...
现在我想到的唯一方法是使用filter / map,做我的副作用并返回true /同一个对象。
在ifPresent之类的终端操作之前,可选的类方法是否不打算用于副作用?
答案 0 :(得分:4)
为什么不将所有操作合并到通过ifPresent
调用的单个lambda中?
getOptionalHumanObject()
.map((Human h1) -> human::getName)
.ifPresent((String name) -> {
System.out.printLn(name)
invokeImportentHttpPostRequest(x)
});
答案 1 :(得分:1)
您可以定义任何Consumer<T>
到身份函数的一般转换,但会产生副作用:
public final class MyFunctions {
public static <T> Function<T, T> doing(Consumer<T> consumer) {
return t -> { consumer.accept(t); return t; };
}
// more here
}
通过静态导入,您可以按如下所示将此功能与Optional.map
一起使用:
getOptionalHumanObject()
.map(Human::getName)
.map(doing(System.out::println))
.map(doing(name -> invokeImportantHttpPostRequest(x)))
.map(String::length);