java世界的變化有點大,java8以後你們都在寫lambdas表達式,感受方法引用也是爲了支持這一特色吧(固然也看到一些人人說沒什麼用)。java
看到這麼一段代碼,是否是很清晰地解釋了了不一樣寫法的區別。函數
能夠看到使用雙冒號(::)將實例引用或類名與方法分開。對象
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.包含類名和方法名,更容易閱讀和理解。get
方法引用主要有如下方式:
1.引用靜態方法
Class::staticMethod
例子: String::valueOfio
2.引用特定對象的實例方法
object::instanceMethod
例子: x::toStringjava8
3.引用特定類型的任意對象的實例方法
Class::methodName
例子: String::toStringstream
這種方法看着很神奇,實際上是脫離不了上下文的,它將用做方法的目標而非參數。lambda
4.引用構造函數
ClassName::new object
names.stream() .map(name -> new Person(name)) .collect(Collectors.toList());
看到一個知乎話題「lambda表達式和方法引用有沒有本質區別」