当前位置: 首页 > 知识库问答 >
问题:

通过流式处理和过滤为带条件的循环进行转换

蓬祺
2023-03-14

我想翻译getFromTestState方法做完全相同的,但使用流和过滤,如果必要的话

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,我应该返回相应的TestState,而不是它的id

共有2个答案

薛烨霖
2023-03-14

符合方法TestState::getFromTestState的工作解决方案如下:

  1. TestStatus
  2. 修复getFromTestStatus方法中的问题:
public enum TestStatus {
    CANCELLED("Cancelled"),
    IN_PROGRESS("In Progress"),
    TO_VALIDATE("To Validate"),
    VALIDATED("Validated"),
    EXPIRED("Expired");

    private final String id;
  
    private TestStatus(String id) {
        this.id = id;
    }
  
    public String getId() { return id; }

    public static TestStatus getFromTestStatus(String status) {
        return Arrays.stream(TestStatus.values())  // Stream.of calls Arrays.stream
            .filter(st -> st.getId().equalsIgnoreCase(status)) // compare id field to status
            .findFirst()   // returns Optional<TestStatus>
            .orElse(null); // fix missing ';', return null if no status is found 
    }
}

测试

System.out.println(TestStatus.getFromTestStatus("cancelled"));
System.out.println(TestStatus.getFromTestStatus("canceled"));

输出:

CANCELLED
null
斜浩穰
2023-03-14

嘿,我会这样做的

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
}
 类似资料:
  • 我试图将此for循环和if条件转换为Java流,过滤和收集 我试过这个: 然而,这是完全错误的。我没能按预期工作 有人能告诉我,我应该如何使用流,过滤,收集?

  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 我有两个简单的POJOs: 然后我生成一些数据,我为父母添加100个孩子: 我的目标是移除所有10岁以下的儿童: 最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。 如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

  • 问题内容: 我有一个MySql表,我想查询其中 成对 的列在特定集中的行。例如,假设我的表格如下所示: 现在,我希望提取其中 (f1,f2) 对为(’a’,30)或(’b’,20)的行,即行2,3,4。我也希望使用“ IN”样式的过滤器来完成此操作,因为我可能有很多对要提取。如果我尝试类似的方法: 我得到IN子句中为f1和f2指定的值的笛卡尔积,即具有f1 =’a’或’b’的所有可能组合的行,以及

  • 问题内容: 我有一个像这样的数组: 现在,我想按某种条件过滤该数组,只保留值等于2的元素,并删除值不等于2的所有元素。 所以我的预期结果数组将是: 注意:我想保留原始数组中的键。 如何使用PHP做到这一点?有内置功能吗? 问题答案:

  • 我需要将这段包含多个for循环和if语句的代码转换为Java 8流: 我需要循环遍历一个数组的名称,并返回一个仅包含不重复的名称的列表。如果一个名字出现不止一次,我需要将它从最终列表中删除。 输入->[“Tom”,“George”,“Tom”,“Mike”,“Brian”] 输出->[“George”,“Mike”,“Brian”] 有谁能帮忙吗?