web-dev-qa-db-ja.com

このラムダをメソッド参照に置き換えます

私は次のコードを持っています。ソナーは、このラムダをメソッド参照に置き換えると文句を言っています。

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::toStringStream<Object><unknown>にどのように変換しますか?

11
fastcodejava

static および non-statictoString()メソッドは両方とも機能シグネチャInteger -> Stringと互換性があるため、あいまいです。代わりにString::valueOfを使用できます。

8
shmosel

Integerには機能インターフェイスInteger::toStringに適合する2つの実装があるため、Function<Integer, String>を配置できませんが、代わりにString::valueOfを使用できます。

Stream.iterate(0, i -> i + 1)
        .limit(100)
        .map(String::valueOf)
        .collect(Collectors.toList())
5
vlad324

@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はそれを提案しないほど賢い。

2
Ousmane D.

私はあなたのコードにとって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());
0
oleg.cherednik