使用流延迟调用多个服务



仅当上一个调用返回空时,如何使用流来评估多个服务调用?

Stream.of(service1(), service2(), service3())
.filter(Objects::nonNull)
.findFirst()
.ifPresent(this::doSomething);

基本上,如果不必调用所有三个服务调用,我不希望调用所有三个服务调用,并且我很感兴趣是否有更好的方法可以在没有一堆

if(service1() != null)
...
else if(service2() != null)
...
else if(service3() != null)
...

假设service1()service2()等中的每一个都返回相同的数据类型,那么你可以提供一个 lambda 表达式来调用每个服务并返回该类型 - 一个Supplier<Result>Result是该数据类型。 也可以提供方法引用。

Stream.<Supplier<Result>>of(YourService::service1, YourService::service2, YourService::service3)

流将延迟计算,因此使用方法引用允许您利用这一点并推迟执行,直到需要时才执行。

.map(supplier -> supplier.get())

执行链的其余部分可以按照您的方式工作。

.filter(Objects::nonNull)
.findFirst()
.ifPresent(this::doSomething);

下面是一个完整的示例:

public class Main {
public static void main(String[] args) {
Stream<Supplier<String>> suppliers =
Stream.of(() -> service1(), () -> service2(), () -> service3(), () -> service4());
suppliers.map(Supplier::get)
.filter(Objects::nonNull)
.findFirst()
.ifPresent(System.out::println);
}
private static String service1() {
System.out.println("service1");
return null;
}
private static String service2() {
System.out.println("service2");
return null;
}
private static String service3() {
System.out.println("service3");
return "hello";
}
private static String service4() {
System.out.println("service4");
return "world";
}
}

最新更新