主題:JDK8預(yù)定義的“函數(shù)式接口”
一、需求:
為什么要提供:JDK 將一些常見的行為模式,進(jìn)行了標(biāo)準(zhǔn)化。
什么是“行為模式”:不涉及處理細(xì)節(jié),從較高層面上說明行為邏輯,如:判斷行為,加工行為,創(chuàng)建行為,運(yùn)算行為,消費(fèi)行為等。
二、具體分類
它們都來自于java.util.function包,并且都帶有FunctionalInterface注解。
一、判斷行為
說明:將傳入的對象簡單的分類為真假
- 接口原型:
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);
}
- demo: 完成對字符串的簡單分類
Predicate<String> predicate=s->s.length()>3;
predicate.test("abcd");//true
- 原型化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)行為。
- 接口原型:
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); };
}
- demo: 完成對字符串長度的打印工作
Consumer<String> consumer=s-> System.out.println(s.length());
consumer.accept("abc");//3
- 原型化接口:
IntConsumer,LongConsumer,DoubleConsumer
三、加工行為:
說明:它是將一種類型的對象,經(jīng)過加工后,變成另一種類型對象的行為(當(dāng)然也可以是同一個類型,但那會是“運(yùn)算行為”的場景)
- 接口原型:
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));
}
- demo: 將String轉(zhuǎn)化成為Integer
//此操作包括一次boxing和一次unboxing
Function<String,Integer> function=s->s.length();
int len=function.apply("mac電腦");//5
- 原型化:
- 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ù)...