2017-04-03 35 views
1

我有一個關於將一個鏈狀態重寫爲流風格的問題。是否可以使用流API簡化這種條件重寫?

我們有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(); 
} 

列表可以來空或非空。所以我們需要檢查這個。 列表大小應該是1或者可以爲空,不能超過1,根據此方法之前的業務邏輯是不可能的。

我不確定它是否很好的實現。從一方面來說,這個條件不太難理解,但從另一方面來說,我們有3個「AND」運算符,在我看來這裏不是很清楚。我想可以簡化這種方法。

謝謝。

+1

假設進入的列表總是非空是否安全? –

+4

列表大小應該是1?你爲什麼需要在這裏流? – vins

+2

@vins提出了一個很好的觀點 - 這是用來傳遞具有多個元素的列表,並且您只想檢查列表中是否有1個元素?我想我們需要更多的用例信息才能給出最佳答案。 –

回答

3

我曾與可選類從Java 8

 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(); 
    } 
+4

是的,這就是我們所說的原始代碼的「簡化」...... – Holger

1

如果您Test類有足夠的equals()方法更新你的代碼,你可以嘗試

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

不知道我會喜歡它,雖然。對不起,沒有流或選項。

相關問題