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 语言合规性。
使用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
如果方法的 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);
我有以下代码片段,我会尝试将其更改为 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 语言合规性。
使用
获得确定的结果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
如果方法的 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);