2019独角兽企业重金招聘Python工程师标准>>>
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("---------------------------------"); //将方法引用赋值给函数式接口 Consumerprinter = 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表达式和方法引用有没有本质区别”