Java 通过流式处理和过滤为带条件的循环进行转换
我想将Java 通过流式处理和过滤为带条件的循环进行转换,java,java-stream,Java,Java Stream,我想将getFromTestStatus方法转换为完全相同的方法,但在必要时使用流和过滤 public enum TestStatus { CANCELLED("Cancelled"), IN_PROGRESS("In Progress"), TO_VALIDATE("To Validate"), VALIDATED("Validated"), EXPIRED("Expired"
getFromTestStatus
方法转换为完全相同的方法,但在必要时使用流和过滤
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
}
public静态可选getFromTestStatus(字符串状态){
返回Stream.of(TestStatus.values())
.filter(id->id.equalsIgnoreCase(status))//这里不需要括号。
.findFirst()//这将返回一个可选值,因此不需要返回null
.orElse(null)//如果强制流在未找到时返回null,则执行此操作
}
嘿,我会这样做
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
}
public静态可选getFromTestStatus(字符串状态){
返回Stream.of(TestStatus.values())
.filter(id->id.equalsIgnoreCase(status))//这里不需要括号。
.findFirst()//这将返回一个可选值,因此不需要返回null
.orElse(null)//如果强制流在未找到时返回null,则执行此操作
}
符合方法TestStatus::getFromTestStatus
的工作解决方案如下:
在TestStatus
修复getFromTestStatus
方法中的问题:
公共枚举测试状态{
已取消(“已取消”),
进行中(“进行中”),
验证(“验证”),
已验证(“已验证”),
过期(“过期”);
私有最终字符串id;
私有测试状态(字符串id){
this.id=id;
}
公共字符串getId(){return id;}
公共静态测试状态getFromTestStatus(字符串状态){
返回Arrays.stream(TestStatus.values())//stream.of calls Arrays.stream
.filter(st->st.getId().equalsIgnoreCase(状态))//将id字段与状态进行比较
.findFirst()//返回可选的
.orElse(null);//修复缺少的“;”,如果未找到状态,则返回null
}
}
测试:
System.out.println(TestStatus.getFromTestStatus(“取消”);
System.out.println(TestStatus.getFromTestStatus(“已取消”);
输出:
CANCELLED
null
符合方法TestStatus::getFromTestStatus
的工作解决方案如下:
在TestStatus
修复getFromTestStatus
方法中的问题:
公共枚举测试状态{
已取消(“已取消”),
进行中(“进行中”),
验证(“验证”),
已验证(“已验证”),
过期(“过期”);
私有最终字符串id;
私有测试状态(字符串id){
this.id=id;
}
公共字符串getId(){return id;}
公共静态测试状态getFromTestStatus(字符串状态){
返回Arrays.stream(TestStatus.values())//stream.of calls Arrays.stream
.filter(st->st.getId().equalsIgnoreCase(状态))//将id字段与状态进行比较
.findFirst()//返回可选的
.orElse(null);//修复缺少的“;”,如果未找到状态,则返回null
}
}
测试:
System.out.println(TestStatus.getFromTestStatus(“取消”);
System.out.println(TestStatus.getFromTestStatus(“已取消”);
输出:
CANCELLED
null
你离它很近:)你离它很近:)这很好!但是我需要返回相应的TestStatus
,而不是它的id
…您不应该将TestStatus映射到相应的id。您只应该在过滤器中使用id。过滤(teststatus->teststatus.getId().equalsIgnoreCase(status))并忽略map语句是的,刚刚发现了,哈哈。谢谢你,伙计!谢谢你给我一点小费。枚举有一个static.valueOf方法,它按名称为您提供相应的枚举。即。valueOf(“TO_VALIDATE”)返回TO_VALIDATE类型。也许这很有用确实如此。再次感谢!这很好!但是我需要返回相应的TestStatus
,而不是它的id
…您不应该将TestStatus映射到相应的id。您只应该在过滤器中使用id。过滤(teststatus->teststatus.getId().equalsIgnoreCase(status))并忽略map语句是的,刚刚发现了,哈哈。谢谢你,伙计!谢谢你给我一点小费。枚举有一个static.valueOf方法,它按名称为您提供相应的枚举。即。valueOf(“TO_VALIDATE”)返回TO_VALIDATE类型。也许这很有用确实如此。再次感谢!