当前位置: 首页 > 知识库问答 >
问题:

Java Lambda表达式参数[重复]

壤驷华美
2023-03-14

我正在尝试在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(

谢谢


共有1个答案

危裕
2023-03-14

很多人在进行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类型的两个参数。

 类似资料:
  • 我有下面的类和对象的ArrayList: 我想要的是从我的列表中得到一个字符串和整数地图,其中包含门票中的目的地和我列表中每个目的地的出现次数。我想它会这样开始,但是我不知道如何继续:

  • 上面写着编译错误 Employee::new、1L、“”、“ 无法解析构造函数。

  • 如何在不包含连续子字符串baa的字母表{a,b,c}上表达正则表达式?

  • 问题内容: 每当我尝试将列表设置为IN表达式中使用的参数时,都会收到非法参数异常。互联网上的各种帖子似乎都表明这是可能的,但对我来说肯定不起作用。我正在使用带有Toplink的Glassfish V2.1。 有没有其他人能够使它正常工作,如果可以的话? 这是一些示例代码: 以及堆栈跟踪的相关部分: 问题答案: 您的JPQL无效,请删除括号

  • 在 JavaScript 中,函数不是“神奇的语言结构”,而是一种特殊的值。 我们在前面章节使用的语法称为 函数声明: function sayHi() { alert( "Hello" ); } 另一种创建函数的语法称为 函数表达式。 通常会写成这样: let sayHi = function() { alert( "Hello" ); }; 在这里,函数被创建并像其他赋值一样,被明确地