如何链接到Java 8供应商

时间:2016-11-11 16:30:31

标签: java lambda java-8

Supplier未提供andThen方法,因此无法将另一个Function链接到Supplier的结果。 使用没有获得任何参数的Function<Void, R>的唯一替代方法是什么?

换句话说,如果Supplier.andThen()存在,我可以写:

 Supplier<Exception> cleanedExceptionSupplier = exceptionSupplier.andThen( 
     e -> clean(e));

由于它不存在,我该如何干净地实施cleanedExceptionSupplier

3 个答案:

答案 0 :(得分:4)

而不是:

 Supplier<T> supp2 = () -> function.apply(supp1.get());

(使用你见过的方法不存在)

......你可以使用:

<table class="Report">
<tbody>
<tr>
<td>
<font><b>Record No: 1</b><br>
<i>Original Date</i>: 12/16/2011<br>
<i>Original Entered Date</i>: 12/16/2011
<br>
<br>
</font>
</td>
</tr>
</tbody>
<table>

答案 1 :(得分:4)

只需将我的备用解决方案添加为候选人

Function<Void, R> supplierAsFunction = v -> returnSomethingOfR();

supplierAsFunction.andThen(function).apply(null); 

null作为参数应用相当丑陋,但此解决方案在仅使用java.util.function类时保持功能样式。

答案 2 :(得分:1)

您可以使用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());

旁注:我Supplier的{​​{1}}看起来不合适。您想要提供的例外确实是主要影响吗?或者是(可能不需要的)角落案例?