java - 通过流式传输和过滤转换带有条件的 for 循环
问题描述
我想翻译getFromTestStatus
方法做同样的事情,但在必要时使用 Stream 和过滤
public enum TestStatus {
CANCELLED("Cancelled"),
IN_PROGRESS("In Progress"),
TO_VALIDATE("To Validate"),
VALIDATED("Validated"),
EXPIRED("Expired");
private final String id;
public static TestStatus getFromTestStatus(String status) {
for (TestStatus testStatus : TestStatus.values()) {
if (testStatus.getId().equalsIgnoreCase(status)) {
return testStatus;
}
}
return null;
}
}
我正在学习使用流,所以我不知道如何实现这一点。到目前为止,我已经完成了以下工作:
public static TestStatus getFromTestStatus(String status) {
return Stream.of(TestStatus.values())
.map(TestStatus::getId)
.filter(id -> {
return id.equalsIgnoreCase(status);
}).collect(Collectors.toList());
}
显然我得到了一个字符串列表,但我不知道如何将它减少到只有一个元素(该列表不超过一个元素)并且如果没有找到元素则为 null。
我也得到了String
,我应该返回相应的 TestStatus,而不是它的id
.
解决方案
嘿我会这样做如下
public static Optional<TestStatus> getFromTestStatus(String status) {
return Stream.of(TestStatus.values())
.filter(id -> id.equalsIgnoreCase(status)) // you don't need the brackets here.
.findFirst() //This returns an optional so you don't need to return null
.orElse(null) //Do this if you force the stream to return null if not found
}
推荐阅读
- python - 具有多个标记的分组条形图
- api - 使用 Google API 禁用 Chrome 设备
- c++ - 修改 int** 2d 数组中的值,该数组是另一个成员变量的成员变量 [C++]
- ruby-on-rails - 无法使用脚本验证动态添加的 CSRF 令牌真实性
- c++ - C++模板函数中静态变量的多个实例
- ubuntu-20.04 - 重启主服务器后,Pacemaker 上的故障转移 IP 设置为从属
- ios - 没有这样的模块'Alamofire' - Xcode 12
- javascript - javacript:修改当前dom(不用于显示)
- angular - 在量角器中初始化之前无法访问“元素”
- libvirt - 无法启动 libvirt 服务