🦝

【Java】プリミティブのint型配列からmap関数でString型に変換

2021/02/11に公開

概要

プリミティブの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