java方法引用(Method References)
阿新 • • 發佈:2018-12-05
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表示式和方法引用有沒有本質區別”