首页 > 解决方案 > 通过流式传输和过滤转换带有条件的 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.

标签: javajava-stream

解决方案


嘿我会这样做如下

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
}

推荐阅读