私は次のコードを持っています。ソナーは、このラムダをメソッド参照に置き換えると文句を言っています。
Stream.iterate(0, i -> i + 1).limit(100).map(i -> Integer.toString(i));
以下のコードに置き換えても、コンパイルエラーでコンパイルされません。型の不一致:Stream<Object>
から<unknown>
に変換できません。
Stream.iterate(0, i -> i + 1).limit(100).map(Integer::toString);
Integer::toString
はStream<Object>
を<unknown>
にどのように変換しますか?
static および non-statictoString()
メソッドは両方とも機能シグネチャInteger -> String
と互換性があるため、あいまいです。代わりにString::valueOf
を使用できます。
Integer
には機能インターフェイスInteger::toString
に適合する2つの実装があるため、Function<Integer, String>
を配置できませんが、代わりにString::valueOf
を使用できます。
Stream.iterate(0, i -> i + 1)
.limit(100)
.map(String::valueOf)
.collect(Collectors.toList())
@shmoselが既に述べたように、ラムダをメソッド参照に置き換えると、署名のtoString
メソッドが2つあるため、あいまいさが生じます。
メソッド参照_Stream<Integer>
_でmap
を呼び出すと、Stream.iterate(0, i -> i + 1)
への呼び出しが_Integer::toString
_を返すため、コンパイラはInteger.toString(i)
またはi.toString()
したがってコンパイルエラー。
既に提供されているものに対する他のオプションは次のとおりです。
_Stream.iterate
_の代わりに_IntStream.iterate
_を使用してからmapToObj
を呼び出すことができます:
_IntStream.iterate(0, i -> i + 1) // IntStream
.limit(100) // IntStream
.mapToObj(Integer::toString); // i1 -> Integer.toString(i1)
_
intelliJ
が提案するもう1つのことは、実際にできることです。
_Stream.iterate(0, i -> i + 1) // Stream<Integer>
.limit(100) // Stream<Integer>
.map(Object::toString); // integer -> integer.toString()
_
ここで_Object::toString
_はラムダinteger -> integer.toString()
と同等です
別の注意点として、Sonarがラムダを、示したコードのメソッド参照に置き換えることを提案しているのは興味深いことです。 intelliJ IDEAはそれを提案しないほど賢い。
私はあなたのコードにとってIntStream
の方が良いと思います:
List<String> numbers = IntStream.range(0, 100)
.mapToObj(String::valueOf)
.collect(Collectors.toList());
または、例としてString.valueOf
を使用してint -> String
を変換します。
List<String> numbers = Stream.iterate(0, i -> i + 1)
.limit(100)
.map(String::valueOf)
.collect(Collectors.toList());