🦝
【Java】プリミティブのint型配列からmap関数でString型に変換
概要
プリミティブのint型配列からStreamのmap関数で、String型に変換しようとするとBad return type in lambda expression: String cannot be converted to int
というエラーが出てしまいます。なお、Integer型の配列からString型に変換は問題なく行えます。これはなんでだろうというのを調べてみましたので、今回書いてみます。
なぜか
Why can't I map integers to strings when streaming from an array?の記事にあるとおり、Arrays.stream(int[])
はStream型ではなくIntStream型を返します。ので、IntStream型ではint型しか扱えないので、そのままだと String型に変換できないわけです。変換するにはmap
ではなくmapToObj
を使う必要があります。
実装まとめ
ということで、上記の内容を実装でまとめたのを下記に記します。
sample.java
// Integer型のmapはOK
Integer[] intArray = {1, 2, 3, 4};
List<String> stringList = Arrays.stream(intArray).map(i -> i.toString()).collect(Collectors.toList());
// int型のmapはNG
int[] intArray2 = {1, 2, 3, 4};
List<String> stringList2 = Arrays.stream(intArray2).map(i -> String.valueOf(i)).collect(Collectors.toList());
// int型でmapToObjを使えばOK
int[] intArray3 = {1, 2, 3, 4};
List<String> stringList3 = Arrays.stream(intArray3).mapToObj(i -> ((Integer)i).toString()).collect(Collectors.toList());
Discussion