主题:JDK8预定义的“函数式接口”
一、需求:
为什么要提供:JDK 将一些常见的行为模式,进行了标准化。
什么是“行为模式”:不涉及处理细节,从较高层面上说明行为逻辑,如:判断行为,加工行为,创建行为,运算行为,消费行为等。
二、具体分类
它们都来自于java.util.function
包,并且都带有FunctionalInterface
注解。
一、判断行为
说明:将传入的对象简单的分类为真假
- 接口原型:
public interface Predicate<T> {
boolean test(T t);
}
它同时带有一些default方法,用于完成lamda的复合操作(见后文):
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
因为泛型是不支持原生类型,使用外覆类型将会增加开销(unboxing),所以提供了三个原型化类
IntPredicate,LongPredcate,DoublePredcate
一个demo:
//此时有unboxing的操作
Predicate<Double> predicate1=num->num>10.0;
//无unboxing操作
DoublePredicate predicate2=num->num>10.0;
二、消费行为:
说明:表示对一个对象的消费行为。
- 接口原型:
public interface Consumer<T> {
void accept(T t);
}
它同时带有一些default方法,用于完成lamda的复合操作(见后文):
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
三、加工行为:
说明:它是将一种类型的对象,经过加工后,变成另一种类型对象的行为(当然也可以是同一个类型,但那会是“运算行为”的场景)
- 接口原型:
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));
}
- demo: 将String转化成为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
待续...