はじめに
Javaにおいて配列からStreamを取得する場合、Stream.of()メソッドまたはArrays.stream()メソッドを用いることで取得することができます。
どちらのメソッドも一見同じ結果が得られるように思えてしまうこともあり、私にはこれらのメソッドの違いがわかっていませんでした。
そこで、これら2つのメソッドの違いを調べてみたところ大きく2つの違いがあることがわかりました。
1.返却される型の違い
プリミティブ型の配列(例えばint[])をこれらのメソッドの引数に用いた時には、返却される型が異なります。
例えばint[]を引数にした場合、Stream.of()メソッドの場合はStreamを返しますが、Arrays.stream()メソッドの場合はIntStreamを返すという違いがあります。
また、プリミティブ型のStreamを用いた処理に理想的なクラスはIntStreamといったプリミティブStreamなので、Stream.of()メソッドを用いた場合は プリミティブStreamに変換する必要があります。
なお、Stream.flatMapToInt()やStream.flatMapToLong()といったメソッドを用いると変換することができます。
2.引数がジェネリクスかどうか
プリミティブ型の配列からStreamを取得しようとした場合、Arrays.stream()メソッドはint[], long[], double[]の3つのプリミティブ型にしか対応していません。
そのため、例えばchar[]はArrays.stream()メソッドに引数として用いることができません。
ただし、参照型に関しては引数に問題なく用いることができます。
一方で、Stream.of()メソッドは引数がジェネリクスであるため、どんな型の配列でも引数で用いることができます。
以上の内容を表にまとめると下記の表1のようになります。
表1. それぞれのメソッドと引数に用いることのできる配列の型の関係
| 引数に用いる配列の型 | Arrays.stream() | Stream.of() |
|---|---|---|
| double型 | ○ | ○ |
| float型 | × | ○ |
| long型 | ○ | ○ |
| int型 | ○ | ○ |
| short型 | × | ○ |
| byte型 | × | ○ |
| char型 | × | ○ |
| boolean型 | × | ○ |
| String型 | ○ | ○ |
| クラス型 | ○ | ○ |
おわりに
以上のことからStream.of()メソッドとArrays.stream()メソッドには返り値の型および引数に適用できる型に違いがあり、プリミティブ型の配列を用いる際には特に注意が必要であるということがわかりました。
一個人の調べてみての感想としては、Stream.of()メソッドの方を使っておくのが無難かなぁという感じです。
これらのメソッドの使い分けについてご意見ありましたらお聞かせいただけますと幸いです。
最後までお読みいただきましてありがとうございました。
参考
https://www.geeksforgeeks.org/difference-between-stream-of-and-arrays-stream-method-in-java/
https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/Arrays.html
https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/util/stream/Stream.html