如何链接到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);
的好处在于函数样式表示,您自然会按照执行顺序从左到右阅读表达式。