JAVA8 Function接口以及同類型的特化的接口

我們先來看下Funtion接口的定義

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
 
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
 
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
 
    static <T> Function<T, T> identity() {
        return t -> t;
    }
}

Funtion接口,定義了一個apply的抽象方法,接收一個泛型T對象,並且返回泛型R對象,看到這裏,是不是對這個接口的描述,還是一頭霧水呢,下面,我們看下幾個例子,來講述這個接口的作用        第一段代碼,表示x,爲傳入參數的類型,也是接口中泛型T,返回的類型也是Integer,調用apply方法,傳入Integer的4,做乘法操作,然後返回R的泛型,Integer類型

Function<Integer, Integer> function1 = x -> x * 2;
        System.out.println(function1.apply(4));// 8
 
        Function<Integer, String> function2 = x -> x * 2 + "dd";
        System.out.println(function2.apply(4));//8dd
        
        Function<String, String> strFunction1 = (str) -> new String(str);
        System.out.println(strFunction1.apply("aa"));//aa
        
        Function<String, String> strFunction2 = String::new;
        System.out.println(strFunction2.apply("bb"));//bb
 
        Function<String, Emp> objFunction1 = (str) -> new Emp(str);
        System.out.println(objFunction1.apply("cc").getName());//cc
        
        Function<String, Emp> objFunction2 = Emp::new;
        System.out.println(objFunction2.apply("dd").getName());//dd


第二段代碼,傳入的泛型T是Integer的,返回的泛型R是String的,裏面的做的操作是傳入的參數x 乘2,然後連接一個dd的字符串,然後的就是泛型R的字符串;

後面的表示創建一個對象的兩種方式,分別調用有一個參數的構造方法,和無參的構造方法,返回泛型R對象;對象Emp的定義如下

public static class Emp {
        private String name;
 
        public Emp() {
 
        }
 
        public Emp(String name) {
            super();
            this.name = name;
        }
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
 
    }

這幾段代碼,可以看出,這個接口,是要傳入的泛型T參數,然後做業務操作,然後泛型R;

這個接口的其他的默認方法以及靜態方法的解釋如下代碼所示,就不在寫案例測試了

 

R apply(T t);
    
    /**
     * 先做傳入的Function類型的參數的apply操作,再做當前這個接口的apply操作
     * V表示這個Function類型的參數的傳入參數類型,也就是本接口的T類型
     * @param before
     * @return
     */
    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
    /**
     * 先做本接口的apply操作,再做傳入的Function類型的參數的apply操作
     * @param after
     * @return
     */
    default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }
    /**
     * 靜態方法表示,這個傳入的泛型參數T的本身
     * @return
     */
    static <T> Function<T, T> identity() {
        return t -> t;
    }

下面我們看下Funtion這個接口的“擴展”的原始類型特化的一些函數接口

IntFunction<R>,IntToDoubleFunction,IntToLongFunction,LongFunction<R>,LongToDoubleFunction,LongToIntFunction,DoubleFunction<R>,ToIntFunction<T>,ToDoubleFunction<T>,ToLongFunction<T>

我們知道,我們在做基礎數據處理的時候(eg: Integer i=0; Integer dd= i+1;),會對基礎類型的包裝類,進行拆箱的操作,轉成基本類型,再做運算處理,拆箱和裝箱,其實是非常消耗性能的,尤其是在大量數據運算的時候;這些特殊的Function函數式接口,根據不同的類型,避免了拆箱和裝箱的操作,從而提高程序的運行效率

 

1.lambda表達式
《java8 Lambda表達式簡介》

《java8 lambda表達式,方法的引用以及構造器的引用》

2.函數式接口
《java8 函數式接口簡介》

《JAVA8 Function接口以及同類型的特化的接口》

《JAVA8 Consumer接口》

《JAVA8 Supplier接口》

《JAVA8 UnaryOperator接口》

《JAVA8 BiConsumer 接口》

3.stream接口操作

《java8 Stream接口簡介》

《 java8 Stream-創建流的幾種方式》

《JAVA8 stream接口 中間操作和終端操作》

《JAVA8 Stream接口,map操作,filter操作,flatMap操作》

《JAVA8 stream接口 distinct,sorted,peek,limit,skip》

《java8 stream接口 終端操作 forEachOrdered和forEach》

《java8 stream接口 終端操作 toArray操作》

《java8 stream接口 終端操作 min,max,findFirst,findAny操作》

《java8 stream接口終端操作 count,anyMatch,allMatch,noneMatch》

《java8 srteam接口終端操作reduce操作》

《java8 stream接口 終端操作 collect操作》

4.其他部分

《java8 Optional靜態類簡介,以及用法》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章