2016-07-14 6 views
1

これはなぜコンパイルされませんか?メソッド参照はコンパイルされません - 整数::新規

​​

それはエラーになります

トークン上

構文エラーは、 "新"、AssignmentOperator

Stream.generate(() -> new Integer(1)).limit(10); 
にこのトークン

確かに、私は書き換えることができ、この式の後に予想さ

しかし、最初の声明が失敗した理由を知りたいのですが...

+2

メソッド参照に追加の引数を指定することはできません。ですから、代わりにラムダ式を使用する必要があります。しかし、Integerのコンストラクタを使うことは、とにかく無意味です。 'Stream.generate(() - > 1)' ... – Holger

+2

を使うことができます。 'Integer :: new(1)'は有効なメソッド/コンストラクタ参照ではないからです。 [JLS](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13) – Flown

答えて

3

メソッド参照に引数を明示的に渡すことはできません。それらは暗黙的に渡すことしかできません。例えば

、あなたはIntStreamを持っている場合、あなたはpublic Integer(int value)コンストラクタのメソッド参照を使用してIntegerインスタンスにmapToObjそれをすることができます:もちろん

IntStream.of(1,1,1).mapToObj(Integer::new)... 

、小さなintの値についてpublic Integer(int value)コンストラクタを使用すると、通常、 Integerの小さな値(-128〜127)のインスタンスをキャッシュするIntegerCacheを利用する代わりに、同じintの値を持つ不要な複数のインスタンスを作成する可能性があるため、悪い考えです。

+2

または、 'IntStream.of(1,1,1).boxed ) '古くなったインスタンスの作成を避けるために... – Holger

+2

@Holgerはい、私はこのコードが意味をなさないとは言いませんでした。私はメソッドリファレンスを使って 'Integer(int)'コンストラクタを呼び出す方法を示しました。 – Eran

+1

実際の 'int'値にかかわらず、自動ボクシングまたは明示的な' Integer.valueOf'のどちらかを使用するのが望ましい方法です。小さな値のみがキャッシュされることが保証されていますが、他のキャッシュがキャッシュされないようにすることはできません。また、ファクトリを使用すると、開発者はオブジェクトのアイデンティティについて何も仮定しません。起こるかどうかJVMがこの方法を知っているので、JVM側の最適化も可能です。 – Holger

関連する問題