我有以下代码段,尝试将其更改为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
有人可以帮我吗
答案 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语言的合规性。
使用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
检查null
或Null Object也可能是一种方法。
使用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);