可选<t>中的副作用方法?

时间:2017-05-19 18:49:42

标签: java

我正在寻找一种方法来执行可能产生副作用的任务。

我想要完成的是以下内容:

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之类的终端操作之前,可选的类方法是否不打算用于副作用?

2 个答案:

答案 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);