前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java1.8新特性--方法的引用

Java1.8新特性--方法的引用

作者头像
Java深度编程
发布2020-06-10 15:55:55
3300
发布2020-06-10 15:55:55
举报
文章被收录于专栏:Java深度编程Java深度编程
简介:

方法引用通过方法的名字来指向一个方法。

方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

方法引用使用一对冒号(::),一般作为参数传入使用,不能单独使用。

方法引用实例1:

使用类静态方法引用,普通对象方法引用,构造器引用:

代码语言:javascript
复制
public static class Car {
    public static Car create( final Supplier< Car > supplier ) {
        return supplier.get();
    }              
        
    public static void collide( final Car car ) {
        System.out.println( "Collided " + car.toString() );
    }
        
    public void follow( final Car another ) {
        System.out.println( "Following the " + another.toString() );
    }
        
    public void repair() {   
        System.out.println( "Repaired " + this.toString() );
    }
}

//为了进行对比非静态类,非静态方法再写一个类
public class Car2 {

    public  Car2 create(final Supplier<Car2> supplier) {
        return supplier.get();
    }

    public void collide(final Car2 car) {
        System.out.println("Collided " + car.toString());
    }

    public void follow(final Car2 another) {
        System.out.println("Following the " + another.toString());
    }

    public void repair() {
        System.out.println("Repaired2 " + this.toString());
    }
}

静态方法引用:它的语法是Class::static_method,实例如下:

代码语言:javascript
复制
final Car car = Car.create( Car::new );
final List< Car > cars = Arrays.asList( car )

对象的方法引用:它的语法是instance::method实例如下:

代码语言:javascript
复制
//普通 方法引用
 Car2 car2 = new Car2();
 List< Car2 > cars2 = Arrays.asList( new Car2() );
 cars2.forEach(car2::follow);//需要follow方法参数为Car类型
//这里需要注意的问题是:对象不能直接引用空参普通方法
 cars2.forEach(car2::repair);//repair方法是空参,会报错。

上面的car2::repair为什么报错?点开forEach源码你会发现它需要的参数是:Consumer<? super T> ,而对象::空参方法得到的返回值为Runnable repair1 = car2::repair,所以就报错了。

构造器引用:它的语法是Class::new,或者更一般的Class< T >::new实例如下:

代码语言:javascript
复制
final Car police = Car.create( Car::new );
cars.forEach( police::follow );
方法引用实例2

在 Java8Tester.java 文件输入以下代码:

代码语言:javascript
复制
import java.util.List;
import java.util.ArrayList;

public class Java8Tester {
   public static void main(String args[]){
      List names = new ArrayList();
    
      names.add("1");
      names.add("2");
      names.add("3");
      names.forEach(System.out::println);
   }
}

实例中我们将 System.out::println 方法作为静态方法来引用。

执行以上脚本,输出结果为:

代码语言:javascript
复制
$ javac Java8Tester.java 
$ java Java8Tester
1
2
3
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java深度编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介:
  • 方法引用实例1:
  • 方法引用实例2
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档