是否可以使用流API简化此条件重写?

时间:2017-04-03 15:53:27

标签: java java-8 refactoring java-stream optional

我有一个关于将一个链条件重写为流式的问题。

我们有一个包含2个字段的实体:

class Test { 
  private boolean isActive = false; 
  private Status status; 

  //getters and setters
} 

我们有条件:

private static boolean isOneAndActiveAndDeprecated(List<Test> test) { 
  return CollectionUtils.size(test) == 1
    && test.get(0).isActive() 
    && Status.DEPRECATED == test.get(0).getStatus(); 
} 

列表可以为null或非null。所以我们需要检查一下。 列表大小应为1或者可以为空,不超过1,根据此方法之前的业务逻辑是不可能的。

我不确定这是好的实施。从一方面来看,这个条件不是那么难以阅读,而是从另一方面看,我们有3个“AND”操作员,在我看来这里并不是很清楚。我想可以简化这种方法。

谢谢。

2 个答案:

答案 0 :(得分:3)

我已使用java 8中的Optional类更新了代码。

     private static boolean isOneAndActiveAndDeprecated(List<Test> test) {
        return Optional
                .ofNullable(test)
                .filter(tests -> test.size() == 1)
                .map(tests -> tests.get(0))
                .filter(Test::isActive)
                .filter(t -> t.getStatus() == Status.DEPRECATED)
                .isPresent();
    }

答案 1 :(得分:1)

如果您的Test课程有足够的equals()方法,您可以尝试

return test.equals(Collections.singletonList(new Test(true, Status.DEPRECATED));

不确定我是否喜欢它。抱歉,没有流或选项。