在java 1.8里如下引用静态方法的代码是可以编译通过的:
// public static String format(String format, Object... args)
BiFunction<String, Object[], String> format = String::format;
System.out.println(format.apply("%s-%d-%x", new Object[]{"str", 6, 15}));
如下引用非静态方法的代码也是可以编译通过的:
// public String toLowerCase()
Function<String, String> toUpperCase = String::toUpperCase;
// public boolean isEmpty()
Function<String, Boolean> isEmpty = String::isEmpty;
但是下面代码不可以:
// public String concat(String str)
Function<String, String> fn = String::concat;
::符号是可以用来引用非静态的方法,但条件是所用的方法模版第一个参数可以是所引用方法的实例且后面的参数和返回类型符合引用的非静态发方法就可以,在调用时会用第一个参数这个实例去调用应用的方法。比如下面的方法是可以的:
public class Test {
public static void main(String[] args) {
// public Calc add(Number x)
BiFunction<Calc, Number, Calc> fn = Calc::add;
Number r = fn.apply(new Calc(10), 3).sub(4).add(1).getResult();
System.out.println(r);
}
}
class Calc {
private Number value;
public Calc() {
value = 0;
}
public Calc(Number s) {
if(s != null) {
value = s;
} else {
value = 0;
}
}
public Calc add(Number x) {
value = value.doubleValue() + x.doubleValue();
return this;
}
public Calc sub(Number x) {
value = value.doubleValue() - x.doubleValue();
return this;
}
public Number getResult() {
return value;
}
}