繁体   English   中英

如何链接到Java 8供应商

[英]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,您可以使用thenAcceptthenApply和其他方法链接它。

作为副作用,您的程序将变得更具反应性。 调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM