2017-05-05 82 views
3

我開始嘗試使用Labda表達式來實現布爾輸入參數列表的布爾門。 對於 「或」 與 「和」 我寫了下面statments:Java中的XOR布爾值列表的Lambda表達式

OR:expressions.stream().anyMatch(e -> e.evaluate(input));

AND:expressions.stream().allMatch(e -> e.evaluate(input));

e.evaluate(input)返回TRUE或FALSE。 但由於沒有onceMatch方法allready實現我堅持異或。

第一個想法會過濾所有真值,並檢查它是否只有一個:

return expressions.stream().filter(e -> e.evaluate(input) == true).collect(Collectors.counting()) == 1; 

但我想看到它在一個lambda表達式。

回答

6

是否恰好有一個比賽,你可以使用

expressions.stream().filter(e -> e.evaluate(input)).limit(2).count() == 1 

limit(2)避免不必要的處理,因爲一旦你遇到過兩場比賽,你已經知道結果不能==1,而無需算上其他比賽。

但是,這不是「異或」邏輯,甚至不是遠程。如果您需要異或操作,可以使用

expressions.stream().map(e -> e.evaluate(input)).reduce((a,b) -> a^b).orElse(Boolean.FALSE) 

與AND或OR不同,無法將XOR操作短路。

+0

你能解釋爲什麼第一個表達式不是XOR,第二個表達式是什麼?我明白,map會創建一個布爾值流:例如[true,false,false,true],但之後我被卡住了。特別是「a^b」部分。這是不是一個bitvise XOR? – froehli

+1

例如'true^true^true == true'儘管沒有確切的一個'true'輸入。從那裏,你可以通過簡單地用'true^false'替換一個'true'來獲得無數的例子,如果你願意的話,例如。取代第一個「真」,我們得到'真'假'真',這也是'真'。 XOR並不意味着「正好一個」真正的「值」...... – Holger

+1

「逐位異或」與「邏輯異或」之間沒有區別。只需將'0'設置爲'false'並將'1'設爲'true',結果將完全相同。 – Holger

1

我不能拿出,將滿足您的需求lambda表達式,但你的第一個想法略有重構看起來很好,對我說:如果你想知道

return expressions.stream().filter(e -> e.evaluate(input)).count() == 1; 
+0

好吧,那確實更好!非常感謝! – froehli