20
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Java】意外に知らないStream.of()とArrays.stream()メソッドの違い

Last updated at Posted at 2019-05-28

はじめに

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

20
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?