(これはおそらくhttps://stackoverflow.com/a/30312177/160137に関連していますが、私はまだそれを得られないのではないかと思いますので、私はこのように質問しています。 )なぜCollectors.toList()はプリミティブコレクションで機能しませんか?
私はストリームを持っているとき、通常、私はコレクタークラスの静的メソッドのいずれかを使用してコレクションに変換することができます。同様のプロセスのように、しかし、プリミティブストリーム上では動作しません
List<String> strings = Stream.of("this", "is", "a", "list", "of", "strings")
.collect(Collectors.toList());
を他の人は気付いた:
IntStream.of(3, 1, 4, 1, 5, 9)
.collect(Collectors.toList()); // doesn't compile
IntStream.of(3, 1, 4, 1, 5, 9)
.boxed()
.collect(Collectors.toList());
をか私はこれを行うことができます:私が代わりにこれを行うことができます
IntStream.of(3, 1, 4, 1, 5, 9)
.collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);
質問は、ある理由Collectors.toList(ちょうどそのプリミティブのストリームのために行う)しないのですか?ラップされた型を指定する方法がないのでしょうか?もしそうなら、なぜこの機能が働かないのでしょうか?
IntStream.of(3, 1, 4, 1, 5, 9)
.collect(Collectors.toCollection(ArrayList<Integer>::new)); // nope
洞察力があれば分かります。
(Java-8の場合でも) 'List 'はありません。プリミティブ型**は**オブジェクトではありません。 –
シグネチャ内のジェネリックはプリミティブ型では機能しません。このように単純です。 – Dici
明示的に 'boxed()'を呼び出すことと、プリミティブストリームでボックス化されたコレクタを使用することには機能的な違いはありません。なぜそれが利便性のために許されていなかったのかを尋ねるなら、おそらくデザイナーはボクシングを容易に明らかにしたいと思った。 – shmosel