2017-03-15 5 views
4

次の文は、無意味ではありますが、構文的には健全です。コンパイル時間:変数のインスタンスが存在しませんUが存在します

final Stream<LongStream> foobar = IntStream.empty() 
    .flatMap(x -> IntStream.empty() 
     .mapToObj(y -> IntStream.empty() 
      .mapToLong(z -> 1))); //compilation error here on `z -> 1` 

それが戻って、コンパイルされないが:

のJava:互換性のない型:ラムダ式 の不良戻り型のないインスタンス(S)型変数(S)のUが、ようにJavaの存在を。

:util.stream.Streamあなたがflatmapを遅らせる場合は、すべてが正常に動作しjava.util.stream.IntStream

に準拠します

.mapToObj(..).flatMap(..)とちょうど.flatMap(..)の違いは何ですか?余分なフラット・マップ・コールを排除する方法はありますか?

+1

この質問は示しています。 –

+2

関連:[なぜ 'IntStream.flatMapToObj()'が存在しないのですか?](http://stackoverflow.com/q/41295766/5743988) – 4castle

+2

@Joe C:lambdasの内側にあるlambdasを問題なく使用しました。実際の問題に合っていれば、それらを避ける理由はありません。現在のIDEは入力中に苦労しますが、(正しい)コードが書かれると円滑に動作します。 – Holger

答えて

5

.mapToObj(..).flatMap(..).flatMap(..)完全に異なる署名を期待しています。

.mapToObj(..).flatMap(..)は、int -> Object関数と、Object -> Stream<?>関数を想定しています。

.flatMap(..)は、int -> IntStreamの機能を想定しています。

コードを分解した場合は、int -> IntStream関数と互換性がないint -> Stream<LongStream>関数を渡しています。

あなたはこの単純化されたコードでsame errorを持っているでしょう:ラムダ内部ラムダ内部ラムダはひどいアイデアである理由

IntStream.empty().flatMap(x -> Stream.of(LongStream.empty())); 
1

私はそれがやっているものを打破するためにあなたの方法をリファクタリングしました:

IntFunction<LongStream> f1 = y -> IntStream.empty().mapToLong(z -> 1); 
IntFunction<LongStream> f2 = x -> IntStream.empty().mapToObj(f1); 
final Stream<LongStream> foobar = IntStream.empty().flatMap(f2); 

我々はここで間違っ二つのことがあります。

ライン2上のラムダがLongStreamを返すのではなく、Stream<LongStream>ていませんストリーム内の各intLongStreamに変換しています。それを単一のLongStreamにする場合は、flatMapToLongを実行する必要があります。

3行目のflatMapは、int -> intという機能が必要です。ただし、代わりにmapToObjを使用できます。これは、提供しているメソッドを使用します。

ので修正方法は次のようになります。

IntFunction<LongStream> f1 = y -> IntStream.empty().mapToLong(z -> 1); 
IntFunction<LongStream> f2 = x -> IntStream.empty().mapToObj(f1).flatMapToLong(i -> i); 
final Stream<LongStream> foobar = IntStream.empty().mapToObj(f2); 
+2

2行目が 'IntFunction >'であるべきではありませんか?私はあなたが質問からのそれらのステートメントにどのように到着したか分からず、自分のステートメントを反論するだけです。また、 'flatMap'は' int - > IntStream'関数を期待しています。 – 4castle

+1

これが最初のステートメントのセットであれば、これは私のIDEでリファクタリング機能を使用しているだけです。 –

+1

@ 4castle全体としての表現は自己矛盾しているので、引数を推論する方法や "the"というエラーをどこで想像するかについて自由度があります。 –

関連する問題