Java8 lambda用于检查两个条件

时间:2019-05-27 14:21:41

标签: java lambda java-8 optional functional-interface

我有以下代码段,尝试将其更改为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

有人可以帮我吗

2 个答案:

答案 0 :(得分:3)

您可以在第一个Optional内添加另一个Optional

Optional o = Optional.of(catList) 
                     .map(catList -> ...)
                     .orElse(Optional.of(dogList)
                                     .map(dogList -> ...));

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

或使用Stream#of

的其他方法

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

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;

答案 1 :(得分:1)

在不显式调用Optional或引发异常的情况下,无法使用return或任何其他类退出方法。在功能接口实现的方法范围内可以理解在lambda表达式中使用return的情况,因此没有机会像显示的代码那样进行操作。

基本上有两种方法可以实现所需的行为并保持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 
    

如果方法的返回参数不是void,则Optional可能用于返回类型定义。可以使用null检查(或再次使用Null Object),但有一种方法在以下位置调用:

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