首先 我們先看到的這個方法入參是: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()); });