【问题标题】:Java Lambda expression parameters [duplicate]Java Lambda表达式参数[重复]
【发布时间】:2016-09-11 18:27:25
【问题描述】:

我正在尝试使用 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");
    }
}

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

块引用

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

谢谢!

【问题讨论】:

标签: lambda java-8


【解决方案1】:

许多人在进行 OO 编程时忽略的是……它是如何真正实现的。假设:

class C {
  public int foo(int parm) { return parm; }

重点是:在对象上“调用”方法的想法是抽象。你将如何在汇编程序中实现它?以便 CPU 可以实际执行该代码。你意识到:在那里“打电话”是不可能的。在那个级别上,您只能调用内存中某处的函数。但是一个函数怎么会知道它拥有的对象呢?!

导致一些很少人知道的事情——你可以把上面的代码写成:

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

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

@Test
public void testIt() {
    assertThat(new C().foo(5), is(5));
}

在我的 Eclipse 中运行良好,单元测试通过,并打印“i: 5”。

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

因此:虽然您的方法看起来只采用一个参数,但“缺失”参数是您调用该方法的对象!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2021-11-27
    相关资源
    最近更新 更多