1. 程式人生 > >【JAVA8之旅】——方法引用

【JAVA8之旅】——方法引用

引言

在java8中方法引用也是非常重要的一個特性,方法引用可以是我們的程式碼的可讀性更高。

一、什麼是方法引用

方法引用是用來直接訪問類或者例項的已經存在的方法或者構造方法。方法引用提供了一種引用而不執行方法的方式,它需要由相容的函式式介面構成的目標型別上下文。計算時,方法引用會建立函式式介面的一個例項。

當Lambda表示式中只是執行一個方法呼叫時,不用Lambda表示式,直接通過方法引用的形式可讀性更高一些。方法引用是一種更簡潔易懂的Lambda表示式。

注意方法引用是一個Lambda表示式,其中方法引用的操作符是雙冒號"::"。

      簡單地說,就是一個Lambda表示式。在Java 8中,我們會使用Lambda表示式建立匿名方法,但是有時候,我們的Lambda表示式可能僅僅呼叫一個已存在的方法,而不做任何其它事,對於這種情況,通過一個方法名字來引用這個已存在的方法會更加清晰,Java 8的方法引用允許我們這樣做。方法引用是一個更加緊湊,易讀的Lambda表示式,注意方法引用是一個Lambda表示式,其中方法引用的操作符是雙冒號"::"。

二、方法引用型別

方法引用的標準形式是:類名::方法名。(注意:只需要寫方法名,不需要寫括號

有以下四種形式的方法引用:

型別 示例
引用靜態方法 ContainingClass::staticMethodName
引用某個物件的例項方法 containingObject::instanceMethodName
引用某個型別的任意物件的例項方法 ContainingType::methodName
引用構造方法 ClassName::new

三、例項demo

    實體程式碼

/**
     * 使用者id,自增
     */
    private Long userId;

    /**
     * 自增id
     */
    private Long partnerId;

    /**
     * 員工登陸賬號
     */
    private String workAccount;

    /**
     * 登陸密碼
     */
    private String password;

    /**
     * 員工姓名
     */
    private String userName;

    /**
     * 使用者狀態:0-刪除 1-啟用 2-停用
     */
    private Byte userState;

    /**
     * 員工手機號
     */
    private String userMobile;

    /**
     * 崗位id
     */
    private Long positionId;

    /**
     * 員工型別 1-普通員工 2-超管
     */
    private Byte userType;

    /**
     * 影子賬戶 0-系統 1-影子賬號
     */
    private Byte shadowAccountFlag;

    /**
     * 建立時間
     */
    private Long createTime;

    /**
     * 更新時間
     */
    private Long updateTime;



  public static int compareByCreateTime(UserTestModel a,UserTestModel b){

       return a.getCreateTime().compareTo(b.getCreateTime());
   }


public int compareByName(UserTestModel a, UserTestModel b){
        return a.getUserName().compareTo(b.getUserName());
    }

    public int comparePartnerId(UserTestModel a,UserTestModel b){
        return a.getPartnerId().compareTo(b.getPartnerId());
    }

3.1 引用靜態方法

public void test(){
		List<RobotUser> userList = this.getUserList();
		List<UserTestModel>userModelList = new ArrayList<>();
		userList.addAll(userList);
		//使用匿名類
		Collections.sort(userModelList, new Comparator<UserTestModel>() {
			@Override
			public int compare(UserTestModel o1, UserTestModel o2) {
			return 	o1.getCreateTime().compareTo(o2.getCreateTime());
			}
		});
		//使用lambda表示式
		Collections.sort(userModelList,(a,b)->a.getCreateTime().compareTo(b.getCreateTime()));
		//使用方法引用

		Collections.sort(userModelList,UserTestModel::compareByCreateTime);
	}

3.2 引用物件的例項方法

public void test1(){
		List<RobotUser> userList = this.getUserList();
		List<UserTestModel>userModelList = new ArrayList<>();
		userList.addAll(userList);

		UserTestModel testModel = new UserTestModel();

		//使用lambda表示式
		Collections.sort(userModelList,(a,b)->testModel.compareByName(a,b));
		//使用方法引用(引用的是物件的例項方法)
		Collections.sort(userModelList,testModel::compareByName);

	}

3.3 某個型別物件的例項方法

public void  test3(){

		List<String>list =Stream.of("Hello","World").collect(Collectors.toList());
		//使用lambda表示式和型別物件的例項方法
		Collections.sort(list,(s1,s2)->s1.compareToIgnoreCase(s2));
		//使用方法引用
		//引用的是型別物件的例項方法
		Collections.sort(list, String::compareToIgnoreCase);
	}

3.4 構造方法引用

組成語法格式:Class::new

建構函式本質上是靜態方法,只是方法名字比較特殊,使用的是new 關鍵字

例子:

String::new, 等價於lambda表示式 () -> new String() 

public void test4(){
		//lambda引用
		Supplier<UserTestModel> userTestModel= () -> new UserTestModel();
		UserTestModel u= userTestModel.get();
		//方法引用(構造方法)
		Supplier<UserTestModel>userTestModel1=UserTestModel::new;

        //陣列建構函式引用
		IntFunction<int[]> arrayMaker  = int[]::new;
		// 建立陣列 int[10]
		arrayMaker.apply(10);
	}

小結

方法引用在某些場景下會使程式碼的可讀性非常的高,所以既然java8為我們提供了這麼寫優雅的寫法,我們還是在平時多加練習!