有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用流延迟调用多个服务

仅当前一个调用返回null时,如何使用stream评估多个服务调用?即

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

基本上,我不希望在不需要调用的情况下调用所有三个服务调用,我感兴趣的是,是否有更好的方法在不使用大量服务调用的情况下实现这一点

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

共 (2) 个答案

  1. # 1 楼答案

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

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

    流将惰性地进行计算,因此使用方法引用允许您利用这一点并将执行延迟到需要时

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

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

        .filter(Objects::nonNull)
        .findFirst()
        .ifPresent(this::doSomething);
    
  2. # 2 楼答案

    下面是一个完整的示例:

    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";
        }
    }