[英]How to chain to a Java 8 Supplier
Supplier
不提供andThen
方法,因此无法将另一个Function
链接到Supplier
的结果。 是否使用没有任何参数的Function<Void, R>
的唯一选择?
换句话说,如果Supplier.andThen()
存在,我可以写:
Supplier<Exception> cleanedExceptionSupplier = exceptionSupplier.andThen(
e -> clean(e));
由于它不存在,我如何干净地实现cleanedExceptionSupplier
?
代替:
Supplier<T> supp2 = supp1.andThen(function);
(使用你见过的方法不存在)
......你可以用:
Supplier<T> supp2 = () -> function.apply(supp1.get());
在这里添加我的替代解决方案作为候选人
Function<Void, R> supplierAsFunction = v -> returnSomethingOfR();
supplierAsFunction.andThen(function).apply(null);
将null
作为参数应用是相当丑陋的,但是这个解决方案在仅使用java.util.function
类时保持了功能样式。
您可以使用CompletableFuture.supplyAsync(supplier)
。 如果supplier
提供SomeType
类型的对象,您将获得CompletableFuture<SomeType>
。
拥有CompletableFuture,您可以使用thenAccept
, thenApply
和其他方法链接它。
作为副作用,您的程序将变得更具反应性。 调用supplyAsync
不会阻止。 实际上,只要您不在CompletableFuture
上调用阻止操作,您就永远不会阻止。
我将按如下方式解决您的情况:
Supplier<Exception> cleanedExceptionSupplier=<some way to get supplier>.
CompletableFuture.supplyAsync(cleanedExceptionSupplier).thenAccept(exception -> System.out.println(exception.toString());
附注:我认为拥有Exception
Supplier
并不合适。 您想要提供的例外确实是主要影响吗? 或者是(可能不需要的)角落案例?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.