Java Lambda表达式参数

sms*_*343 1 lambda java-8

我正在尝试使用Java中的Lambda表达式来理解以下方法参考代码:

interface MyFunc<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;
    }
}

class InstanceMethWithObjectRefDemo {

    static <T> int counter(T[] vals, MyFunc<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;

        HighTemp[] weekDayHighs = {new HighTemp(89), new HighTemp(82),
            new HighTemp(90), new HighTemp(89),
            new HighTemp(89), new HighTemp(91),
            new HighTemp(84), new HighTemp(83)};

        count = counter(weekDayHighs, HighTemp::sameTemp,
                new HighTemp(89));
        System.out.println(count + " days had a high of 89");

        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)};

        count = counter(weekDayHighs2, HighTemp::sameTemp,
                new HighTemp(12));
        System.out.println(count + " days had a high of 12");

        count = counter(weekDayHighs, HighTemp::lessThanTemp,
                new HighTemp(89));
        System.out.println(count + " days had a high less than 89");

        count = counter(weekDayHighs2, HighTemp::lessThanTemp,
                new HighTemp(19));
        System.out.println(count + " days had a high of less than 19");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么函数sameTemp只有一个参数?接口声明它必须有2个参数,所以对我来说没有意义.也许hTemp实例变量对两者都足够了?我从Java那里得到了完整的参考书,作者在那里解释了这个:

大段引用

在程序中,请注意HighTemp有两个实例方法:sameTemp( )lessThanTemp( ).如果两个HighTemp对象包含相同的温度,则第一个返回true.如果调用对象的温度小于传递的对象的温度,则第二个返回true.每个方法都有一个HighTemp类型的参数,每个方法都有一个布尔结果.因此,每个都与MyFunc功能接口兼容,因为调用对象类型可以映射到第一个参数,func( )并且参数映射到func( )第二个参数.

谢谢!

Gho*_*ica 10

在进行面向对象编程时,许多人忽略了......这是如何真正实现的.假设:

class C {
  public int foo(int parm) { return parm; }
Run Code Online (Sandbox Code Playgroud)

关键是:在对象上"调用"方法的想法是一种抽象.你会如何在汇编程序中实现它; 这样CPU就可以实际执行该代码.你意识到:"呼唤"是不可能的.在那个级别,你只在内存中的某个地方调用函数.但是一个函数如何知道它自己的对象?!

导致很少人知道的事情 - 您可以将上述代码编写为:

class C {
  public int foo(C this, int i) {
        System.out.println("i: " + i);
        return i;
   }
}
Run Code Online (Sandbox Code Playgroud)

为了安全起见,我还在日食中写了一个小测试:

@Test
public void testIt() {
    assertThat(new C().foo(5), is(5));
}
Run Code Online (Sandbox Code Playgroud)

在我的日食,单位测试通行证中运行良好,并打印"i:5".

所以,整个秘诀是:在对象上定义方法时,总会有一个(通常是不可见的)第一个参数"this"赋予该方法!

因此:虽然您的方法看起来只需要一个参数,但"missing"参数是您调用该方法的对象!

从这个意义上讲:boolean func(T v1, T v2)要求两个类型为T的参数.这两个方法,如boolean sameTemp(HighTemp ht2)...可以写成boolean sameTemp(HighTemp this, HighTemp ht2); et voila:T型的两个参数


归档时间:

查看次数:

454 次

最近记录:

9 年,4 月 前