2017-01-19 11 views
56

Javaでは、Booleanクラスの新しいメソッドが追加されました。Java 8 Boolean.logicalOrメソッド

のは、ちょうど約1それらの

public static boolean Boolean.logicalOr(boolean a , boolean b)

をお話しましょう、私の質問は、なぜ彼らは必要とされた、ありますか?

次の2つのケースの違いは何ですか?

boolean result = a || b;またはBoolean result = Boolean.logicalOr(a,b);そんなに特別な何

についてBoolean.logicalOr()と私は他の上の1つを好む必要があるとき。

+14

javadocとは何ですか?それは役に立ちそうな '@ see'リファレンスを持っていますか? –

+4

機能的には同じですが、あなたのコードに 'Boolean.logicalOr(a、b)'を書き込まないでください。コードを書くための機能的に同じ複数の方法がある場合、常に最も読みやすいものを選択する必要があります。 – VGR

答えて

77

主にこれらのメソッドは、lambda /ストリームのメソッド参照を使用してコードを読みやすくするためのものです。例を見てみましょう:

Stream.of(/* .. some objects .. */) 
     .map(/* some function that returns a boolean */) 
     .reduce(Boolean::logicalOr); 

a || bでこれを書き込もう:右、

Stream.of(...) 
     .map(...) 
     .reduce((a, b) -> a || b); // logicalOr is actually using || 

その読めませんか?

コメントにSotirios Delimanolisが記載されているので、javadocを見て、@see BinaryOperatorに従うこともできます。または、function package summary javadocをご覧ください。

+1

'|'はロジックでも、短絡していないだけでも構いません。 – shmosel

+0

ok ...コメントに 'logicalOr'が実際に' || 'を使用しています – Roland

+1

私はそれがはっきりしていると思います。それは実際には何の違いもありませんが、それはその議論を直接操作しているからです。 – shmosel

52

これはメソッド参照と関係がある。このように、lambdasでも||(論理演算子)または演算子を使用することができます。関数参照の代わりに、(a,b) -> a || bのようなラムダ式を使用してObjects.isNullなど

ようもあり、このよう他の新機能で

は、より多くのストリームとラムダ「ルック&フィール」に沿ったものです。
また、メソッド参照のバイトコードが少なくなり、実行時間が短縮されます(少なくともビット単位)。

+1

'BiConsumer'は値を返しません。なぜ[documentation](https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html#logicalOr-boolean-boolean-)のように 'BinaryOperator'を使用しないのですか? – shmosel

+1

今10ヶ月間Javaの世界から外れました;-) コードなしで残しておきます。 – Sebastian

+18

メソッド呼び出しであるため、 '||'の短絡動作が失われることに注意してください。 – Kevin

3

次の2つのケースの違いは何ですか?
ブール結果= a || b;またはブール結果=ブール値。論理値(a、b);

私は上記の質問に関してここにポイントを入れたいと思います。ここでBoolean.logicalOr

public static boolean logicalOr(boolean paramBoolean1, boolean paramBoolean2) 
    { 
    return (paramBoolean1) || (paramBoolean2); 
    } 

のボディは、だから我々はそれが最終的にa || bをやっていることがわかりますです。しかし||の代わりにBoolean.logicalOrを使用すると非短絡になります。なぜなら、それは他の論理演算子に付属しているa || bとは異なる(a || b)と考えられるからです(Boolean.logicalOr)。
例:以下のスニペットコードを参照してください。以下は

public static void main(String[] args) { 

    boolean bCheck1 = false, bCheck2 = true, bCheck3 = false; 
    System.out.println("bCheck1\t" + "bCheck2\t" + "bCheck3\t" + "checkOR-Result\t" + "checkLogicalOr-Result"); 

    bCheck1 = true; bCheck2 = true; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = true; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = true; bCheck2 = false; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = true; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = true; bCheck3 = false; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
    bCheck1 = false; bCheck2 = false; bCheck3 = true; 
    System.out.println(bCheck1 +"\t"+ bCheck2 +"\t"+ bCheck3 +"\t"+ checkOR(bCheck1, bCheck2, bCheck3) + "\t\t" + checkLogicalOr(bCheck1, bCheck2, bCheck3)); 
} 

private static boolean checkOR(boolean bCheck1, boolean bCheck2, boolean bCheck3){ 
    return bCheck1 && bCheck2 || bCheck3; 
} 

private static boolean checkLogicalOr(boolean bCheck1, boolean bCheck2, boolean bCheck3){ 
    return bCheck1 && Boolean.logicalOr(bCheck2, bCheck3); 
} 

結果 - です:

bCheck1 bCheck2 bCheck3 checkOR-Result checkLogicalOr-Result 
true true true true   true 
true true false true   true 
true false true true   true 
true false false false   false 
false true true true   false 
false true false false   false 
false false true true   false 
false false true true   false 

我々は、それが他の論理演算子と一緒に使用されていたときに、それは異なる結果を生成するだ見ることができます。したがって、Boolean.logicalOr以上の||を使用するか、その逆の使用には注意が必要です。明らかにBoolean.logicalOr||より読みやすくなります。しかし、それぞれの意味があり、以下のように使用することができます。
if(bCheck1 && bCheck2 || bCheck3)if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))
に置き換えることはできませんが、if(bCheck1 && (bCheck2 || bCheck3))if(bCheck1 && Boolean.logicalOr(bCheck2, bCheck3))に置き換えることは間違いなく良い考えです。

+0

条件演算子は左から右に実行されますが、 "()"が存在すれば優先順位が優先されます。だから、あなたのコードの出力はまったく正しいですが、上記の質問には関係ありません。 http://introcs.cs.princeton.edu/java/11precedence/。機械が間違った出力を与えることはありません:) – Joy

+0

@Joy私は演算子の優先順位を理解しています。 **私の答えは、** Boolean.logicalOr()については何が特別なのですか?また、いつ他のものを優先するべきですか?**&**次の2つのケースの違いは何ですか?**。私は、この優先順位をまだ理解していない初心者を考慮して、この非常に簡単な例を与えました。ベテランにとっては無駄かもしれないが、どんな初心者にも役立つだろう。 –

関連する問題