2016-11-05 9 views
4

Java 8でインスタンスのメソッド参照をどのように正確にチェーンしていますか?例:CivilizationインスタンスのJavaメソッドの参照はここでは想定されていません

Collections.sort(civs,Comparator.comparing(Civilization::getStrategy.getStrategLevel)); 

getStrategyインスタンスメソッドgetStrategyLevelを有するStrategyオブジェクトのインスタンスを返します。

なぜ、Comparator.comparingメソッドは、ラムダ式で実装された機能インタフェースを持つコンパレータを返さないのですか?その場合

+4

だけの使用、それは次のようになりlambda expressionとだからここ

、ラムダ。 –

+0

メソッド参照は、メソッド_を参照しています。メソッドの参照で説明するのには適切ではありません。命令コードの任意の袋を記述したい場合は、チェーンの "getStrategy()"メソッドをコールし、結果で 'getStrategyLevel()ラムダ本体は引数のリストが目的の関数インターフェースのものと正確に一致する単一のメソッドである特別な場合に提供される(うまくいってもっと読みやすい)簡略表記である。 –

+0

参照:http:// stackoverflow。com/questions/24487805/lambda-expression-vs-method-reference/24493905#24493905 –

答えて

3

、あなたがラムダを使用する必要がありますが、あなたは直接メソッド参照を適用することはできません。

Collections.sort(civs, Collectors.comparing(c -> c.getStrategy().getStrategLevel())); 

けれども、ここではメソッドの参照を使用する方法があります。あなたは問題があなたは、メソッドを参照してそれを行うことはできません

Collections.sort(civs, Collectors.comparing(CivilizationUtils::getKeyExtractor)); 
+0

getStrategyは静的メソッドではありません –

+0

'Strategy'のインスタンスを通してインスタンスメソッド' getStrategyLevel'にメソッド参照を提供する方法は? 「文明」のインスタンスを通じてアクセスされる。私はちょうどコンパレータのための通常のラムダ式を使用する必要がありますか? –

1
Collections.sort(civs,Comparator.comparing(civ -> civ.getStrategy().getStrategLevel())); 
3

よう

class CivilizationUtils { 
    public static Integer getKeyExtractor(Civilization c) { 
     return c.getStrategy().getStrategLevel(); 
    } 
} 

のようなクラスを解決することができている、あなたはラムダ式を使用するか、または静的を作成する必要があると仮定すると方法。

方法参照の4種類がある:

  1. 静的メソッドへの参照
  2. ContainingClass::staticMethodName同様の参照特定のオブジェクト
    への参照
  3. containingObject::instanceMethodName等のインスタンスメソッドが 特定のタイプの任意のオブジェクトのインスタンスメソッドのようなものについて ClassName::new

詳細などのコンストラクタからは

  • 参照。

    Collections.sort(civs, Comparator.comparing(c -> c.getStrategy.getStrategLevel())); 
    

    それとも、静的メソッドに

    public static int getStrategLevel(Civilization c) { 
        return c.getStrategy().getStrategLevel(); 
    } 
    

    を作成する場合には次に、あなたのコードは次のようになります:

    Collections.sort(civs, Comparator.comparing(MyClass::getStrategLevel)); 
    
  • 関連する問題