Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)


首先 我們先看到的這個方法入參是:Function<? super Object , V> mapper ,這是jdk1.8為了統一簡化書寫格式引進的函數式接口 。
簡單 解釋一下我對Function函數的理解 , 就以上面的寫法為例,可以看到Function函數要傳入兩個類型:
	1.  ? super Object  這個類型限制了下限 , 即 傳入的類型必須是Object的超類,或者是Object ,所以 ,函數的第一個類型必然是 Object類型 ,后面會說為什么會是Object類型
	2.  V  沒有限制泛型的上下邊界 , 所以可以為任何類型
	3. 	每個函數式接口的典型特點就是有且僅有一個可以實現的接口 , Function也不例外;看下接口部分源碼:
	
	@FunctionalInterface
	public interface Function<T, R> {
	 R apply(T t); 
	 ...
	}
	4. 看到這里應該明白,這個接口做的就是類型之間 T和R 的轉換 ,傳入T類型 ,返回R類型。
	5. 那么上面的Function<? super Object, V>寫法 就是說 傳入Object類型 , 返回 V 類型 。

對Function接口,就說這么多 ,這里不做詳細解釋 ,想了解可以去自行搜索。	

對於mp的業務方法listObjs()方法 ,我們只討論它的泛型方法 ,下面是方法介紹
mp官網接口介紹

// 查詢全部記錄
1. <V> List<V> listObjs(Function<? super Object, V> mapper);
// 根據 Wrapper 條件,查詢全部記錄
2. <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper);

接口源碼

 1. default List<Object> listObjs() {
        return this.listObjs(Function.identity());
    }

 2.  default <V> List<V> listObjs(Function<? super Object, V> mapper) {
        return this.listObjs(Wrappers.emptyWrapper(), mapper);
    }

 3.  default List<Object> listObjs(Wrapper<T> queryWrapper) {
        return this.listObjs(queryWrapper, Function.identity());
    }

 4. default <V> List<V> listObjs(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
        return (List)this.getBaseMapper().selectObjs(queryWrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList());
    }

可以看到接口源碼中 方法2 調用了方法4

方法4的意義是 :
				this.getBaseMapper().selectObjs(queryWrapper):
				拿到BaseMapper,再調用它的selectObjs方法傳入queryWrapper條件,查出數據list,
				stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()):
				再利用流處理,過濾掉空值,篩選出mapper類型的數據,重新組成一個集合。就得到了我們所需要的List<V>數據。
這個V類型就是我們上面所說的Function中所傳的泛型V,就是我們想要轉換的類型。

接下來看一下我們在Service業務方法中 對Function的方法實現以及對listObjs()方法的調用。

1.先實例化出Function接口 ,實現apply接口,進行類型轉換,
	其中Object類型的參數是我們實體類中使用Mp的@TableId注解標注的屬性,
	## 由於主鍵屬性的類型不定,所以mp只能定為Object類型來限制傳參。 ##
	如果沒有標注注解,則根據屬性名對應數據庫表的字段進行匹配查找(參數一般都是主鍵id,除非你使用@TableId注解標注了其他字段)
 		Function<Object,Long> function = new Function<Object, Long>() {
            @Override
            public Long apply(Object id) {
            //進行一系列轉換操作 ,最終返回我們所需要的類型V , 這里只做簡單演示。
                return Long.valueOf(id.toString());
            }
        };
2.調用listObjs(queryWarpper,function)方法,這里queryWrapper就不做介紹。  
      
	List<Long> longs1 = listObjs(null, function);

3.經過Function的處理我們會得到表中數據的所有主鍵做組成的list集合。

另兩種寫法 , 和上面的寫法一致 ,推薦最后一種。

		//匿名類寫法
		List<Long> longs = listObjs(null,  new Function<Object, Long>() {
            @Override
            public Long apply(Object id) {
            //進行一系列轉換操作 ,最終返回我們所需要的類型V , 這里只做簡單演示。
                return Long.valueOf(id.toString());
            }
        });
        //簡寫
 		List<Long> longs = listObjs(null, a ->{
            return Long.valueOf(a.toString());
        });

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM