【问题标题】:Confusion about two-argument method reference [duplicate]关于双参数方法参考的困惑[重复]
【发布时间】:2016-12-08 02:00:06
【问题描述】:

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

counter() 期望 BiFunction 但是 HighTemp::lessThanTemp 是一个有效的参数,尽管 HighTemp.lessThanTemp() 只接受一个参数。

这行到底发生了什么:if (f.func(vals[i], v))

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

【问题讨论】:

  • 提示:不要定义自己的MyFunc接口,而是使用BiFunction或其子类型BinaryOperator
  • @dimo414 编译结果是“5天的高点小于19”。我对这实际上是如何工作感到困惑
  • @JimGarrison f.func(vals[i],v) 接受两个参数,但 f.func 不是引用 HighTemp::lessThanTemp ,它只接受一个参数。 boolean lessThanTemp(HighTemp ht2)
  • 啊,我误读了这个问题。第一个参数没有得到this 引用吗?我似乎记得读过编译器神奇地推断出来。
  • 我喜欢有趣的精心编写的问题,这些问题挑战我挖掘文档并让我学习新东西。欢迎使用 StackOverflow!

标签: java lambda java-8 method-reference


【解决方案1】:

查看relevant documentation,其中注释:

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

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

(a, b) -> a.lessThanTemp(b)

【讨论】:

  • 供参考JLS 15.13.3如果形式是ReferenceType :: [TypeArguments] Identifier....如果编译时声明是实例方法,那么目标引用是调用方法的第一个形参
猜你喜欢
  • 2017-04-25
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2015-01-30
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多