Lamda的深入認(rèn)知(三)


主題:JDK8預(yù)定義的“函數(shù)式接口”

一、需求:

  1. 為什么要提供:JDK 將一些常見的行為模式,進(jìn)行了標(biāo)準(zhǔn)化。

  2. 什么是“行為模式”:不涉及處理細(xì)節(jié),從較高層面上說明行為邏輯,如:判斷行為,加工行為,創(chuàng)建行為,運(yùn)算行為,消費(fèi)行為等。

二、具體分類

它們都來自于java.util.function包,并且都帶有FunctionalInterface注解。

一、判斷行為

說明:將傳入的對象簡單的分類為真假

  1. 接口原型:
public interface Predicate<T> {
  boolean test(T t);
}

它同時帶有一些default方法,用于完成lamda的復(fù)合操作(見后文):

default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }
  1. demo: 完成對字符串的簡單分類
        Predicate<String> predicate=s->s.length()>3;
        predicate.test("abcd");//true
  1. 原型化Predicate
  • 因?yàn)榉盒褪遣恢С衷愋停褂猛飧差愋蛯黾娱_銷(unboxing),所以提供了三個原型化類
    IntPredicate,LongPredcate,DoublePredcate

  • 一個demo:

        //此時有unboxing的操作
        Predicate<Double> predicate1=num->num>10.0;
        //無unboxing操作
        DoublePredicate predicate2=num->num>10.0;

二、消費(fèi)行為:

說明:表示對一個對象的消費(fèi)行為。

  1. 接口原型:
public interface Consumer<T> {
    void accept(T t);
}

它同時帶有一些default方法,用于完成lamda的復(fù)合操作(見后文):

    default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
  1. demo: 完成對字符串長度的打印工作
        Consumer<String> consumer=s-> System.out.println(s.length());
        consumer.accept("abc");//3
  1. 原型化接口:
    IntConsumer,LongConsumer,DoubleConsumer

三、加工行為:

說明:它是將一種類型的對象,經(jīng)過加工后,變成另一種類型對象的行為(當(dāng)然也可以是同一個類型,但那會是“運(yùn)算行為”的場景)

  1. 接口原型:
public interface Function<T, R> {
    R apply(T t);
}

復(fù)合的默認(rèn)方法:

default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
  1. demo: 將String轉(zhuǎn)化成為Integer
        //此操作包括一次boxing和一次unboxing
        Function<String,Integer> function=s->s.length();
        int len=function.apply("mac電腦");//5
  1. 原型化:
  • demo:
        //將String加工成為int
        ToIntFunction<String> function1=s->s.length();
        //將int加工成為String
        IntFunction<String> function2=i->i+"";
  • 種類:
IntFunction<R>/ToIntFunction<T>
LongFunction<R>/ToLongFunction<T>
DoubleFunction<R>/ToDoubleFunction<T>

IntToDoubleFunction/IntToLongFunction
LongToDoubleFunction/LongToIntFunction

待續(xù)...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容