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表达式和方法引用有没有本质区别

猜你喜欢

转载自my.oschina.net/u/2277632/blog/2979236
今日推荐