2017-08-21 5 views
4

私はStreams APIを頭に浮かべています。異なるデータ型をストリーム

の最初の行には何が起こっていますか?どのようなデータ型として扱われますか?なぜこれは印刷されません?以下のコードのコンパイルにはない、なぜこの質問の2番目の部分はある

System.out.println(Stream.of("hi", "there",2).anyMatch(i->i=="2")); 

2は、引用符ではありませんか)?

System.out.println(Stream.of("hi", "there",2).anyMatch(i->i==2)); 
+0

'2' urストリームはIntegerとして扱われます。 –

+0

Streamの要素はSerializablesです。そのため、intの隣に文字列があります。 – Lidjan

+0

また、==で文字列を比較しないでください。常に.equals()を使用してください。 –

答えて

7

最初のスニペットでは、ObjectStreamを作成しています。 2要素はIntegerなので、String "2"と比較するとfalseが返されます。

Objectから2への変換がないため、2番目のスニペットでは、任意のオブジェクトをint 2と比較することはできません。

System.out.println(Stream.of("hi", "there", "2").anyMatch(i->i.equals("2"))); 
:最初のスニペットはtrueを返すためには

、あなたはString(ともStringプールに依存しないために、代わりに==equalsを使用)へのストリームの最後の要素を変更する必要がありますequals任意Objectに対して存在するので

第二のスニペットは、代わり==equalsを用いて固定することができる:ヨーヨーにおいて

System.out.println(Stream.of("hi", "there",2).anyMatch(i->i.equals(2))); 
+0

あなたは私が推測する細部で私を打つだろう:) – nullpointer

3

あなたの代わりに使用すべきである。その理由は、(ストリームから)Objectあると互換性がありません、あなたがやっているanyMatchiためである内の比較である

System.out.println(Stream.of("hi", "there",2).anyMatch(i->i.equals(2))); 

intとなります。

また、整数(オブジェクト)とオブジェクト文字列"2"とを比較しているため、最初の部分が正常にコンパイルされるため、falseが返されることに注意してください。

+0

お返事ありがとうございます。 .equalsメソッドを使用しても、falseを返します。それはなぜあなたが感じるのですか? – JonJavaK

+0

@JonJavaKもう一度 '.equals(" 2 ")と比較しない限り、' .equals(2) 'で** true **を返すべきです。 – nullpointer

+1

ああ、ごめんなさい。はい、あなたが正しい。ありがとう! – JonJavaK

関連する問題