如何链接到Java8供应商

如何链接到Java8供应商,java,lambda,java-8,Java,Lambda,Java 8,供应商不提供和方法,因此无法将另一个函数链接到供应商的结果。 是使用不获取任何参数的函数的唯一替代方法吗 换句话说,如果Supplier.and()存在,我可以写: Supplier<Exception> cleanedExceptionSupplier = exceptionSupplier.andThen( e -> clean(e)); Supplier cleanedExceptionSupplier=例外供应商,然后( e->clean(e)); 由

供应商
不提供
方法,因此无法将另一个
函数
链接到
供应商
的结果。 是使用不获取任何参数的
函数
的唯一替代方法吗

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

 Supplier<Exception> cleanedExceptionSupplier = exceptionSupplier.andThen( 
     e -> clean(e));
Supplier cleanedExceptionSupplier=例外供应商,然后(
e->clean(e));

由于它不存在,我如何才能干净地实现
cleanedExceptionsSupplier

您可以使用
CompletableFuture.supplyAsync(supplier)
。 拥有提供类型为
SomeType
的对象的
supplier
,您将获得
CompletableFuture

有了CompletableFuture,您可以使用方法
然后Accept
然后Apply
和其他方法链接它

作为副作用,您的程序将变得更加被动。调用
supplyAsync
不会阻塞。实际上,只要不调用
CompletableFuture
上的阻塞操作,就永远不会阻塞

我将按如下方式解决您的案件:

Supplier<Exception> cleanedExceptionSupplier=<some way to get supplier>.
CompletableFuture.supplyAsync(cleanedExceptionSupplier).thenAccept(exception -> System.out.println(exception.toString());
Supplier cleanedExceptionSupplier=。
CompletableFuture.supplySync(cleanedeExceptionsSupplier)。然后接受(异常->系统.out.println(异常.toString());
旁注:我认为有
供应商
属于
例外情况
是不对的。例外情况确实是您想要提供的主要影响吗?还是(可能是不需要的)角落情况?

而不是:

 Supplier<T> supp2 = supp1.andThen(function);
Supplier supp2=supp1.然后(功能);
(其中,使用了您所看到的不存在的方法)

…您可以使用:

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

只需将我的备选解决方案添加到此处即可

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

supplierAsFunction.andThen(function).apply(null); 
Function supplierAsFunction=v->returnSomethingOfR();
supplierAsFunction.and(function.apply)(null);

null
应用为参数相当难看,但此解决方案在仅使用
java.util.function
类的情况下保持了函数风格。

我编辑了原始问题以添加该示例。我必须承认
Exception
是一个完全任意的选择。有趣的方法,但有点违背了函数链接,因为我想表达从左到右的有序调用链。您的解决方案与此相反,从右到左阅读。@danieln没错,但它有现有的优点。这里给出了有趣的替代解决方案,但我仍然坚持我的原始解决方案,以提高函数样式的可读性和
仅限java.util.function
类。因此,您可以同时控制
供应商的创建和评估位置,以便您可以将类型更改为
function
,从而使整个任务不存在问题。@Holger是的,此解决方案仍然有点尴尬,因为我无法使用
供应商
,只有一个
函数
…而您仍在手动调用
apply
。在我看来,
R R=returnSomethingOfR();X=Function.apply(R);
的好处在于函数样式表示,您自然会按照执行顺序从左到右阅读表达式。