Java8 用于检查两个条件的 lambda

Java8 lambda for checking two conditions

我有以下代码片段,我会尝试将其更改为 lambda 函数。

if(catList != null && catList.size() > 0) {
    animalType = AnimalType.CAT;
    HttpEntity<List<?>> request = new HttpEntity<>(catList, headers);
    response = restTemplate.postForObject(apiUrl, request, String.class);
} else if(dogList != null && dogList.size() > 0) {
    animalType = AnimalType.DOG;
} else {
    return;
}

不知何故我写了如下所示,但不知道合并 dogList 检查条件

Optional.of(catList) 
    .map(catList -> {
        ....
    })
    .orElse(return); //<------ THIS IS NOT POSSIBLE

谁能帮我解决这个问题

您可以在第一个 Optional

中添加另一个 Optional
Optional o = Optional.of(catList) 
                     .map(catList -> ...)
                     .orElse(Optional.of(dogList)
                                     .map(dogList -> ...));

或者使用 Stream 的其他方法,如果您可以使对服务的调用足够通用的话

或其他方法使用 Stream#of

它基本上会遍历两个列表,找到第一个不为空的列表(但如果需要,您可以向过滤器添加其他条件)并将通用调用应用于服务。

Optional o = Stream.of(catList, dogList)
                   .filter(Objects::nonNull /*or other condition if you want*/)
                   .findFirst()
                   .map(list -> /*generic call to service*/);

并以这种方式调用它

if (!o.isPresent()) return;

如果不显式调用 return 或抛出异常,则无法使用 Optional 或任何其他 class 退出方法。 return 在 lambda 表达式中的用法在功能接口实现的方法的范围内被理解,因此没有机会按照您显示的代码进行操作。

基本上有两种方法可以实现所需的行为并保持 Java 语言合规性。

  1. 使用return Optional.

    获得确定的结果

    在这里我可能会重复一个现有的答案,但你能做的最好的是:

    Optional<MyObject> optional = Optional.of(catList) 
        .map(catList -> new HttpEntity<>(catList, headers))
        .map(httpEntity -> restTemplate.postForObject(apiUrl, request, String.class));
    
    if (!optional.isPresent()) { return; }           // here the method execution is terminated
    

    检查 nullNull Object 可能也是一种方法。

  2. 抛出异常使用Optional::orElseThrow允许方法终止方法并抛出Exception。不幸的是,它迫使上层需要处理它或重新抛出)。

    MyObject myObject = Optional.of(catList) 
        .map(catList -> new HttpEntity<>(catList, headers))
        .map(httpEntity -> restTemplate.postForObject(apiUrl, request, String.class))
        .orElseThrow(MyObjectException::new);        // here the method execution is terminated 
    

如果方法的 return 参数不是 void,则 Optional 可能用于 return 类型定义。 null 检查(或者再次 Null Object 是一种方法)可能会被使用,方法调用于:

 return Optional.of(catList) 
        .map(catList -> new HttpEntity<>(catList, headers))
        .map(httpEntity -> restTemplate.postForObject(apiUrl, request, String.class))
        .orElse(null);