【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)(上)

简介: 【小家java】java8新特性之---函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)(上)

相关阅读

【小家java】java5新特性(简述十大新特性) 重要一跃

【小家java】java6新特性(简述十大新特性) 鸡肋升级

【小家java】java7新特性(简述八大新特性) 不温不火

【小家java】java8新特性(简述十大新特性) 饱受赞誉

【小家java】java9新特性(简述十大新特性) 褒贬不一

【小家java】java10新特性(简述十大新特性) 小步迭代

【小家java】java11新特性(简述八大新特性) 首个重磅LTS版本


【小家java】java8新特性之—Base64加密和解密原理

【小家java】java8新特性之—反射获取方法参数名

【小家java】java8新特性之—全新的日期、时间API(完全实现了JSR 310规范)

【小家java】java8新特性之—Optional的使用,避免空指针,代替三目运算符

【小家java】java8新特性之—lambda表达式的的原理

【小家java】java8新特性之—函数式接口(Supplier、Consumer、Predicate、Function、UnaryOperator,通往高阶设计的好工具)

【小家java】java8新特性之—方法引用

【小家java】java8新特性之—Stream API 详解 (Map-reduce、Collectors收集器、并行流)

【小家java】java8新特性之—外部迭代和内部迭代(对比性能差异)


每篇一句

再穷不要借了钱过后消失。再难,不要说话不算数。堂堂正正的做人,明明白白的做事,永远不要丢掉别人对你的信任。因为别人信任你是在别人心目中存在的价值。人生路很长,自己不要把路走窄了


什么是函数式接口?


所有函数式接口都在这个包:java.util.function


首先,它还是一个接口,所以必须满足接口最基本的定义。但它是一个特殊的接口:SAM类型的接口(Single Abstract Method)。可以在调用时,使用一个lambda表达式作为参数。

定义要求:


   1.只能有一个抽象方法需要被实现


@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}


备注:此处不包括与Object的public方法(clone方法不行,因为clone方法是protected,编译会报错)重名的方法。当然里面的默认方法、static方法都是无所谓的


default 修饰的默认方法方法,这个关键字是Java8中新增的,为的目的就是使得某一些接口,原则上只有一个方法被实现,但是由于历史原因,不得不加入一些方法来兼容整个JDK中的API,所以就需要使用default关键字来定义这样的方法


   2.可以有从Object继承过来的抽象方法,因为所有类的最终父类都是Object


   3.接口中唯一抽象方法的命名并不重要,因为函数式接口就是对某一行为进行抽象,主要目的就是支持Lambda表达式。


以下附JDK 8之前已有的函数式接口:

java.lang.Runnable

java.util.concurrent.Callable

java.security.PrivilegedAction

java.util.Comparator

java.io.FileFilter

java.nio.file.PathMatcher

java.lang.reflect.InvocationHandler

java.beans.PropertyChangeListener

java.awt.event.ActionListener

javax.swing.event.ChangeListener


Java8还提供了@FunctionalInterface注解来帮助我们标识函数式接口。所以Java8后上面那些接口都被打上了这个标记。


下面给出一张图:说出Java8新提供的函数式接口们(可以满足99%需求):


image.png


四大核心函数式接口:


image.png



public interface Supplier


其简洁的声明,会让人以为不是函数。这个抽象方法的声明,同Consumer相反,是一个只声明了返回值,不需要参数的函数(这还叫函数?)。也就是说Supplier其实表达的不是从一个参数空间到结果空间的映射能力,而是表达一种生成能力。


Supplier<String> supplier = String::new;


其他Supplier扩展接口:


BooleanSupplier:boolean getAsBoolean();返回boolean


DoubleSupplier:double getAsDouble();返回double


IntSupplier:int getAsInt();返回int


LongSupplier:long getAsLong();返回long



public interface Consumer


这个接口声明太重要了,应用场景太多了。因为需要返回值的我们用Function,不需要返回值的,我们用它就可。


Consumer consumer = System.out::println;


看其源码 还有个默认方法andThen:

void accept(T t);
 default Consumer<T> andThen(Consumer<? super T> after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }


andThen可以实现消费两次。消费一次后,继续消费一次。使用场景:


其他Consumer扩展接口:


BiConsumer:void accept(T t, U u);接受两个参数


DoubleConsumer:void accept(double value);接受一个double参数


IntConsumer:void accept(int value);接受一个int参数


LongConsumer:void accept(long value);接受一个long参数


ObjDoubleConsumer:void accept(T t, double value);接受一个泛型参数一个double参数


ObjIntConsumer:void accept(T t, int value);接受一个泛型参数一个int参数


ObjLongConsumer:void accept(T t, long value);接受一个泛型参数一个long参数



相关文章
|
4天前
|
Java 测试技术
Java接口的生产环境应用注意点
在Java生产环境中,合理使用接口对提升代码质量至关重要。设计接口时应遵循单一职责原则,采用清晰命名,并控制方法数量。默认方法应谨慎使用,避免与实现类产生冲突。通过版本化管理接口更新,确保向后兼容。实现接口时需明确行为,保持实现与接口分离,利用多态增强灵活性。关注性能影响,适当文档注释及充分测试确保接口稳定可靠。综合运用这些策略,可以显著提高系统的可扩展性和维护性。
|
4天前
|
Java
Java 接口的简化理解
Java 接口是一种强大的概念,用于定义方法签名而非具体实现,作为行为规范,强调功能而非实现细节。接口是特殊的引用类型,包含常量和方法签名。其特点包括:无实现方法体、支持多重继承、内置常量定义。通过示例展示了如何定义和实现接口,以及如何通过接口引用调用实现类的方法。接口的应用场景包括抽象化、插件架构和松耦合设计。从 Java 8 起,接口还支持默认方法和静态方法,进一步增强了其灵活性和扩展性。理解接口是 Java 编程的基础之一。
|
6天前
|
Java
接口和抽象类【Java面向对象知识回顾②】
本文讨论了Java中抽象类和接口的概念与区别。抽象类是不能被实例化的类,可以包含抽象和非抽象方法,常用作其他类的基类。接口是一种纯抽象类型,只包含抽象方法和常量,不能被实例化,且实现接口的类必须实现接口中定义的所有方法。文章还比较了抽象类和接口在实现方式、方法类型、成员变量、构造方法和访问修饰符等方面的不同,并探讨了它们的使用场景。
接口和抽象类【Java面向对象知识回顾②】
|
5天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
18 2
|
9天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
19天前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
13天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
11天前
|
Java 开发者
Java中的多线程基础与应用
【9月更文挑战第22天】在Java的世界中,多线程是一块基石,它支撑着现代并发编程的大厦。本文将深入浅出地介绍Java中多线程的基本概念、创建方法以及常见的应用场景,帮助读者理解并掌握这一核心技术。
|
7天前
|
Java 调度
Java-Thread多线程的使用
这篇文章介绍了Java中Thread类多线程的创建、使用、生命周期、状态以及线程同步和死锁的概念和处理方法。
Java-Thread多线程的使用
|
13天前
|
Java
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
领略Lock接口的风采,通过实战演练,让你迅速掌握这门高深武艺,成为Java多线程领域的武林盟主
22 7

热门文章

最新文章

下一篇
无影云桌面