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

关于双参数方法参考的混淆[重复]

陶星渊
2023-03-14

我对这个方法引用语法有点困惑。

counter()需要一个双函数,然而,尽管温度较高,lessThanTemp仍然是有效的参数。lessThanTemp()只接受一个参数。

这一行到底发生了什么:if(f.func)

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

共有1个答案

刘乐童
2023-03-14

请参阅相关文档,其中指出:

方法引用的等效lambda表达式String::compareToIgnoreCase将具有形式参数列表(字符串a,字符串b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)。

换句话说,HighTemp::ThanTemp等价于lambda表达式:

(a, b) -> a.lessThanTemp(b)
 类似资料:
  • 我是一名自学型开发人员,现在正在学习Java。我了解到,要对函数接口使用方法引用,我们引用的方法的签名必须与该函数接口内抽象方法的签名匹配。 但是在学习比较器时,发现“Comparator.comparing()”方法接受函数接口并返回一个比较器。我知道函数接口的抽象方法必须接受一个参数并返回一个值。 但是我可以将任何部分(而不是完全)匹配Function接口签名的方法(作为方法参考)传递给比较器

  • 我尝试了以下代码,但不理解输出: 输出:字符串 为什么? 感谢您的关注!

  • 书中的这部分内容描述了 Swift 编程语言的正式语法。这里描述的语法意在帮助你了解语言的更多细节,而不是允许你直接实现解析器或者编译器。 Swift 语言相对较小,因为看上去出现在 Swift 代码中各种地方的常见类型、函数和运算符实际上是在 Swift 标准库中定义的。尽管这些类型、函数和运算符不是 Swift 语言自身的一部分,但它们还是在书中这部分的讨论当中大量使用了。 如何阅读语法 用来

  • 本页内容包括: 如何阅读语法 本书的这一节描述了Swift编程语言的形式语法。这里描述的语法是为了帮助您更详细的了解该语言,而不是让您直接实现一个解析器或编译器。 Swift语言相对小点,这是由于在Swift代码中几乎无处不在的许多常见的的类型,函数以及运算符都由Swift标准库来定义。虽然这些类型,函数和运算符不是Swift语言本身的一部分,但是它们被广泛用于这本书的讨论和代码范例。 如何阅读语

  • 我正在阅读关于线程的oracle java教程,我看到了这个示例 当有人可能使用这些方法签入他们的代码时?thread.interrupt(标志)是静态的,所以通过上面的检查,我们实际上检查是否有任何踏面被中断了?即使是这样,根据教程,当线程通过调用静态方法thread.interrupted检查中断时,中断状态将被清除。或任何通过抛出InterruptedException退出的方法在这样做时将