2016-10-12 26 views
5

誰かがメソッド参照を使用するために次のコードを変換するのを助けることができますか?私はこの新しい構文のまわりで私の頭をラップしようとしているが、それは、単一のメソッド呼び出しにマップされたばかりの単一の変数よりも複雑なったとき、私はすぐに迷子:ラムダをメソッド参照に変換する

getWorkspaces().stream().forEach((ws) -> { 
      DataStoreInfo defaultDataStore = getDefaultDataStore(ws); 
      if (defaultDataStore != null) { 
       other.setDefaultDataStore(ws, defaultDataStore); 
      } 
     }); 

「私はこれで始めたが、それはdoesnのトン作業:)

getWorkspaces().stream() 
       .map(this::getDefaultDataStore) 
       .filter(Objects::nonNull) 
       .map(other::setDefaultDataStore); 

編集:「それは動作しません」と、私はIDEはそれがメソッドを解決できないことを「setDefaultDataStore」の下の最後の行に文句を意味します。私は働くものから始めることができればいいが、そこに行く方法は分からない。メソッド参照を使用して2つのパラメータを取得するメソッドを呼び出す方法と、それがどのようにマップされるかについて、私は非常に混乱しています。これに

getMaps().stream().forEach((m) -> { 
      other.add(m); 
     }); 

:私はこのようになりますいくつかのコードを変換しました

getMaps().forEach(other::add); 

しかし、それはより複雑になったとき、私は迷子になります。私はメソッド参照で同じコードを書く方法の明白な解決策があることを望んでいました。

+3

「動作しない」とはどういう意味ですか?より具体的に、理想的には[mcve]を提供してください。 –

+2

@GhostCat:私は持っていませんが、それはそれ以上の詳細なしでは "それは動作しません"それは理想的な質問から遠くになります。 –

+2

"メソッド参照を使用する"ことを試みる前に、それを使わないで動作するものを書く必要があります...2番目のスニペットはラムダ式でも機能せず、メソッド参照の使用には関係しません。まず、 'setDefaultDataStore'に2つのパラメータが必要です。だからあなたはそれらを保管する必要があります。 – Tunaki

答えて

1

コードをこのようなラムダバージョンに変換できますが、期待どおりにはクリーンではありません。

words.stream().map(ws -> new SimpleImmutableEntry<>(ws, getDefaultDataStore(ws))) 
       .filter(e -> e.getValue() != null) 
       .forEach(e -> setDefaultDataStore(e.getKey(), e.getValue())); 

注:eは、エントリの略です。方法は https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

を参照について

1

あなたは、呼び出しがメソッドを存在していたが、あなたのラムダは何もしない場合は、メソッドの参照に置き換えることができ、ここで多くの有用な情報を読み取ることができます。だからラムダに慣れていれば、簡単にメソッド参照に対処できます。にcontainingObject :: instanceMethodName

  • リファレンス - ContainingClass :: staticMethodName
  • 特定のオブジェクトのインスタンスメソッドに
  • リファレンス -

    は、それらの4種類の静的メソッドへ

    1. リファレンスありインスタンス 特定の任意のオブジェクトのメソッド タイプ - ContainingType :: methodName
    2. construcへの参照tor - ClassName :: new

    質問に戻る: .map(other :: setDefaultDataStore);

    ストリームメンバーを介していくつかのサイド操作を実行するためにマップ関数を使用しないでください。ストリームを別のストリームに変換するために使用されます。ユーザーforeach代わりに

    getWorkspaces().stream() 
           .map(this::getDefaultDataStore) 
           .filter(Objects::nonNull) 
           .foreach(other::setDefaultDataStore); 
    
  • 関連する問題