如何在一个带有两个Lambda的目标中引用一个带有一个参数的方法?

时间:2017-01-12 08:43:20

标签: java lambda

在Lambda表达式中,我研究了以下示例。 但我不明白这里代码的逻辑。

此处执行sameTemp函数的方式和位置。因为我将它作为方法引用传递但是我调用f.func(vals[i], v),即使sameTemp接受1个参数。

package lambda;

//A functional interface that takes two reference arguments 
//and returns a boolean result. 
interface MyFunc5<T> {
    boolean func(T v1, T v2);
}

class HighTemp {

    private int hTemp;

    HighTemp(int ht) {
        hTemp = ht;
    }

    boolean sameTemp(HighTemp ht2) {
        return hTemp == ht2.hTemp;
    }

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

}

public class InstanceMethWithObjectRefDemo {

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

        for (int i = 0; i < vals.length; i++)
            if (f.func(vals[i], v))
                count++;

        return count;
    }

    public static void main(String args[]) {
        int count;

        // Create an array of HighTemp objects.
        HighTemp[] weekDayHighs = { new HighTemp(89), new HighTemp(82), new HighTemp(89)};
        //Why there is no error referencing sameTemp to the place of MyFunc5<T> f because MyFunc5<T> f
        //has 2 args while sameTemp has 1
        count = counter(weekDayHighs, HighTemp::sameTemp, new HighTemp(89));
        System.out.println(count + " days had a high of 89");

    }

}

2 个答案:

答案 0 :(得分:1)

如果您使用Type::instanceMethod形式的方法引用(不要与instance::instanceMethod混淆),则生成的lambda会隐式地将实例作为其第一个参数,并使用该实例调用该实例上的方法剩下的论点。因此,HighTemp::sameTemp相当于(HighTemp ht1, HighTemp ht2) -> ht1.sameTemp(ht2),与MyFunc5.func() T HighTemp时的f.func(vals[i], v)功能签名相同。

换句话说,当您致电vals[i].sameTemp(v)时,它会被转换为ListView

答案 1 :(得分:0)

本例中的第一个参数是vals[i]本身。所以基本上

f.func(vals[i], v)
HighTemp::sameTemp f作为<{p}}的

vals[i].sameTemp(v)