2017-05-05 8 views
3

ブール値入力パラメータのリストのためにブール値を実装するためにLabda式を試してみました。ブール型リストのJavaラムダ式のXOR

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

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

e.evaluate(input)戻り真または偽 "または" と "と" 私が書いた次たstatmentsについては 。 しかし、onceMatchメソッドがすべて実装されていないので、私はXORに固執しています。

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

しかし、私は1つのラムダ式でそれを見たい:

最初のアイデアは、すべての真の値をフィルタリングし、それがちょうど1であるかどうかを確認することです。

答えて

6

を知りたい場合は、正確に1があるかどうかマッチ、あなたは他の試合をカウントしなくても、あなたは2試合に遭遇したら、あなたはすでに結果が==1することができないことを知っているよう

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

limit(2)は、不要な処理を回避使用することができます。

しかし、これは「XOR」ロジックではなく、リモートでもありません。 XOR演算を使用する場合は、使用することができます。

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

XOR演算を短絡する方法はありません。

+0

最初の式がXORでない理由と、2番目の式がどういう理由を説明できますか?マップがブール値のストリームを作成することを理解しています。 [真実、偽、虚偽、真実]しかし、それ以来私は立ち往生しています。特に "a^b"部分。それはbitvise xorではない? – froehli

+1

など。 'true^true^true == true'という文字列があります。そこから、あなたが望むのであれば、例えば 'true'を' true^false'に置き換えるだけで無限の数の例を導き出すことができます。最初の 'true'を置き換えると、' true^false^true^true'も得られます。 XORは単に「真の値」ということを意味しません。 – Holger

+1

「bitwise xor」と「logical xor」には違いはありません。 'false'に' 0'、 'true'に' 1'を設定すると、結果はまったく同じになります... – Holger

1

私はあなたのニーズに合うかラムダ式を考え出すことはできませんが、あなたの最初のアイデアのわずかなリファクタリングは、私には罰金になります。

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

よく、それは本当に良い!今までありがとう! – froehli