1. 程式人生 > >java方法引用(Method References)

java方法引用(Method References)

java世界的變化有點大,java8之後大家都在寫lambdas表示式,感覺方法引用也是為了支援這一特點吧(當然也看到一些人人說沒什麼用)。

看到這麼一段程式碼,是不是很清晰地解釋了了不同寫法的區別。

可以看到使用雙冒號(::)將例項引用或類名與方法分開。

Iterable介面的foreash方法傳入Consumer作為引數,Consumer可以作為lambdas表示式或者方法引用實現。

//使用labdas表示式
Stream.of(3,5,3,2,6,5,7,3,22,12).forEach(x->System.out.print(x));

System.out.println("---------------------------------");

//使用方法引用
Stream.of(3,5,3,2,6,5,7,3,22,12)
        .forEach(System.out::print);
System.out.println("---------------------------------");

//將方法引用賦值給函式式介面
Consumer<Integer> printer = System.out::print;
Stream.of(3,5,3,2,6,5,7,3,22,12)
        .forEach(printer);

System.out.println("---------------------------------");

大神說方法引用比起lambda表示式,1.程式碼更短,2.包含類名和方法名,更容易閱讀和理解。

方法引用主要有以下方式:
1.引用靜態方法 
Class::staticMethod
例子: String::valueOf

2.引用特定物件的例項方法 
object::instanceMethod
例子: x::toString

3.引用特定型別的任意物件的例項方法 
Class::methodName 
例子: String::toString

這種方法看著很神奇,其實是脫離不了上下文的,它將用作方法的目標而非引數。

4.引用建構函式 
ClassName::new 

names.stream()                     
          .map(name -> new Person(name))  
          .collect(Collectors.toList());

看到一個知乎話題“lambda表示式和方法引用有沒有本質區別