2016-12-08 9 views
4

このメソッド参照構文について少し混乱します。2つの引数のメソッド参照に関する混乱

counter()BiFunctionしかしHighTemp::lessThanTempを期待HighTemp.lessThanTemp()が一つだけの引数を取るにもかかわらず、有効な引数です。

正確に何が起こっていますか:if (f.func(vals[i], v))

MCVE:

import java.util.function.BiFunction; 

class Demo { 
    static class HighTemp { 
    private int hTemp; 

    HighTemp(int ht) { hTemp = ht; } 

    boolean lessThanTemp(HighTemp ht2) { 
     return hTemp < ht2.hTemp; 
    } 
    } 

    static <T> int counter(T[] vals, BiFunction<T,T,Boolean> f, T v) { 
    int count = 0; 

    for (int i=0; i < vals.length; i++) { 
     if (f.apply(vals[i], v)) { // THIS LINE 
     count++; 
     } 
    } 

    return count; 
    } 

    public static void main(String args[]) {  
    HighTemp[] weekDayHighs2 = { new HighTemp(32), new HighTemp(12), 
           new HighTemp(24), new HighTemp(19), 
           new HighTemp(18), new HighTemp(12), 
           new HighTemp(-1), new HighTemp(13) }; 

    int count = counter(weekDayHighs2, HighTemp::lessThanTemp, new HighTemp(19)); 
    System.out.println(count + " days had a high of less than 19"); 
    } 
} 
+0

ヒント:代わりに、独自の 'MyFunc'インタフェースを定義する、[' BiFunction'](https://docs.oracleを使用.com/javase/8/docs/api/java/util/function/BiFunction.html)またはそのサブタイプ['BinaryOperator'](https://docs.oracle.com/javase/8/docs/api/java/ util/function/BinaryOperator.html)。 – dimo414

+0

@ dimo414コンパイル結果は「5日間が19日未満」です。 これは実際にどのように動作するのか混乱しています – KuKKi

+0

@JimGarrison 'f.func(vals [i]、v)'は2つの引数をとりますが、f.funcは 'HighTemp :: lessThanTemp'これは1つの議論しか取らない。 'boolean lessThanTemp(HighTemp ht2)' – KuKKi

答えて

3

指摘され、relevant documentationを見てみましょう:

をメソッド参照String::compareToIgnoreCaseのための同等のラムダ式はa正式なパラメータリスト(String a, String b)を、持っているとbうこの例をよりよく説明するために使用される任意の名前です。メソッド参照はメソッドa.compareToIgnoreCase(b)を呼び出します。言い換えれば

HighTemp::lessThanTempは、ラムダ式と同等です。

(a, b) -> a.lessThanTemp(b) 
+1

参照用に[JLS 15.13.3](http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13.3)。 _フォームがReferenceType :: [TypeArguments] Identifierの場合....コンパイル時の宣言がインスタンスメソッドである場合、ターゲット参照は呼び出しメソッドの最初の仮パラメータです_ –

関連する問題