Lamda的深入认知(三)


主题:JDK8预定义的“函数式接口”

一、需求:

  1. 为什么要提供:JDK 将一些常见的行为模式,进行了标准化。

  2. 什么是“行为模式”:不涉及处理细节,从较高层面上说明行为逻辑,如:判断行为,加工行为,创建行为,运算行为,消费行为等。

二、具体分类

它们都来自于java.util.function包,并且都带有FunctionalInterface注解。

一、判断行为

说明:将传入的对象简单的分类为真假

  1. 接口原型:
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);
    }
  1. demo: 完成对字符串的简单分类
        Predicate<String> predicate=s->s.length()>3;
        predicate.test("abcd");//true
  1. 原型化Predicate
  • 因为泛型是不支持原生类型,使用外覆类型将会增加开销(unboxing),所以提供了三个原型化类
    IntPredicate,LongPredcate,DoublePredcate

  • 一个demo:

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

二、消费行为:

说明:表示对一个对象的消费行为。

  1. 接口原型:
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); };
    }
  1. demo: 完成对字符串长度的打印工作
        Consumer<String> consumer=s-> System.out.println(s.length());
        consumer.accept("abc");//3
  1. 原型化接口:
    IntConsumer,LongConsumer,DoubleConsumer

三、加工行为:

说明:它是将一种类型的对象,经过加工后,变成另一种类型对象的行为(当然也可以是同一个类型,但那会是“运算行为”的场景)

  1. 接口原型:
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));
    }
  1. demo: 将String转化成为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

待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容