当前位置: 首页 > news >正文

Java—JDK8新特性—函数式接口【内含思维导图】

目录

3.函数式接口

思维导图

3.1 什么是函数式接口

3.2 @functionalinterface注解 源码分析

3.3 Lambda表达式和函数式接口关系

3.4 使用函数式接口

3.5 内置函数式接口

四大核的函数式接口区别

3.5.1 Supplier 函数式接口源码分析

3.5.2 Supplier 函数式接口使用

3.5.3 Consumer 函数式接口源码分析

3.5.4 Consumer 函数式接口使用 

3.5.5 Function 函数式接口源码分析

3.5.6 Function 函数式接口使用 

3.5.7 Predicate 函数式接口源码分析

3.5.8 Predicate 函数式接口使用 


3.函数式接口

思维导图

3.1 什么是函数式接口

        如果一个接口中只包含一个抽象方法,这个接口称为函数式接口

如果一个接口包含,一个抽象方法、一个默认方法、一个静态方法,这个接口也是函数式接口


3.2 @functionalinterface注解 源码分析

        一个标记性注解

        在定义接口是函数式接口时,可以使用 @functionalinterface 注解进行标注,该注解会在编译器对这个接口进行检查

        如果使用@functionalinterface 注解来定义接口,编译器将会强制检查该接口,是否只有一个抽象方法,否则会报错。


3.3 Lambda表达式和函数式接口关系

        Lambda表达式就是一个函数式接口的实例

        如果一个对象是函数式接口的实例,那么该对象就可以用Lambda表达式,用匿名实现类表示的地方都可以用Lambda表达式替换


3.4 使用函数式接口

        可以使用JDK中内置的函数式接口,也可以自定义函数式接口

案例1:

先定义一个函数式接口

@FunctionalInterface
public interface MyFun<T> {T getValue(T t);
}

写一个实现类,FunctionInterfaceDemo1,进行对给定字符串转为大写

/*** 函数式接口使用*/
public class FunctionInterfaceDemo1 {public static void main(String[] args) {//需求: 使用函数式接口,将给定的字符转为大写//1.使用原始方法System.out.println(toUpperCase("hello"));//2.使用函数式接口String result1 = toLowerCase(new MyFun<String>() {@Overridepublic String getValue(String s) {return s.toUpperCase();}}, "hello");System.out.println("result1:" + result1);String result2 = toLowerCase( s -> s.toUpperCase(), "hello");System.out.println("result2:" + result2);}// 定义一个方法,将给定的字符串转为大写public static String toUpperCase(String str) {return str.toUpperCase();}/*** 将给定的字符串转为大写* @param function 函数式接口* @param str 给定字符串* @return*/public static String toLowerCase(MyFun<String> function, String str) {return function.getValue(str);}
}

运行结果:


3.5 内置函数式接口

在JDK8中内置了以下四大核的函数式接口

        Supplier接口、Consumer接口、Function接口、Predicate接口 

四大核的函数式接口区别

函数式接口参数类型返回类型使用说明
Consumer<T>Tvoid

对类型为T的对象应用操作,

包含方法:void accept(T t)

Supplier<T>T

返回类型为T的对象,

包含方法:T get()

Function<T,R>R

对类型为T的对象应用操作,

并返回结果为R类型的对象。包含方法:Rapply(T t)

Predicate<T>Tboolean

确定类型为T的对象是否满足某约束,

并返回布尔值。包含方法: booleantest(T t)

3.5.1 Supplier 函数式接口源码分析

3.5.2 Supplier 函数式接口使用

案例:

/*** JDK内置Supplier函数式接口的使用*/
public class SupplierDemo1 {public static void main(String[] args) {getMax(new Supplier<Integer>() {@Overridepublic Integer get() {//1.定义一个数组int[] arr = {12,23,34,94,555,60,27,38,99};//2.对数组进行排序Arrays.sort(arr);//3.将最大值返回return arr[arr.length - 1];}});getMax(() ->{//1.定义一个数组int[] arr = {12,23,34,94,555,60,27,38,99};//2.对数组进行排序Arrays.sort(arr);//3.将最大值返回return arr[arr.length - 1];});}private static void getMax(Supplier<Integer> supplier) {int max = supplier.get();System.out.println(max);}
}

运行结果:

3.5.3 Consumer 函数式接口源码分析

         消费一个数据,其数据类型由泛型参数决定

        Consumer 函数式接口,可以通过accept()方法参数传递过来的数据进行处理

        有参无返回接口

3.5.4 Consumer 函数式接口使用 

案例:

/*** JDK内置 消费型函数式接口 Consumer 使用*/
public class ConsumerDemo {public static void main(String[] args) {transform(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s.toUpperCase());}});transform(s -> System.out.println(s.toUpperCase()));}public static void transform(Consumer<String> consumer) {consumer.accept("hello Consumer");}
}

3.5.5 Function 函数式接口源码分析

        根据一个类型的数据得到另外一个类型的数据,有参有返回

        Function转换型接口,对apply()方法传入的T类型数据进行处理,返回R类型的结果

3.5.6 Function 函数式接口使用 

案例:

/*** JDk内置功能型接口 Function 使用*/
public class FunctionDemo {public static void main(String[] args) {System.out.println(calculate(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return  Integer.parseInt(s);}}));System.out.println(calculate( s-> Integer.parseInt(s)));System.out.println(calculate1(s-> Integer.parseInt(s), i -> i +5));}public static int calculate(Function<String,Integer> function) {Integer value = function.apply("10");return value + 5;}public static int calculate1(Function<String,Integer> f1,Function<Integer,Integer> f2) {Integer value2 = f1.andThen(f2).apply("10");return value2;}
}

3.5.7 Predicate 函数式接口源码分析

        需要对某种类型的数据进行判断,从而得到一个Boolean值结果,常用于条件判断场景

3.5.8 Predicate 函数式接口使用  

/*** JDK内置断言函数式接口 Predicate 使用*/
public class PredicateDemo {public static void main(String[] args) {testName(s -> s.length() > 3,"张三");testAnd(s -> s.contains("A"),s -> s.contains("B"),"ABC");testAnd(s -> s.contains("A"),s -> s.contains("B"),"Abc");testOr(s -> s.contains("Z"),s -> s.contains("Y"),"Zxc");testOr(s -> s.contains("Z"),s -> s.contains("Y"),"zxc");testNegate(s -> s.contains("Q"),"iQ");testNegate(s -> s.contains("Q"),"asd");}/*** 使用Lambda表达式判断 名字长度是否超过3个字*/private static void testName(Predicate<String> predicate,String name) {System.out.println(predicate.test(name) ? "超过3个字" : "没有超过3个字");}/*** 使用Lambda表达式判断一个字符中,包含A,包含B* 使用了Predicate 中的 and 与* default Predicate<T> and(Predicate<? super T> other) {*         Objects.requireNonNull(other);*         return (t) -> test(t) && other.test(t);*     }*/private static void testAnd(Predicate<String> p1,Predicate<String> p2,String str) {System.out.println(p1.and(p2).test(str) ? "yes" : "no");}/*** 使用Lambda表达式判断一个字符中,可能包含Z 或者 可能 包含Y* 使用了Predicate 中的 or 或* default Predicate<T> or(Predicate<? super T> other) {*         Objects.requireNonNull(other);*         return (t) -> test(t) || other.test(t);*     }*/private static void testOr(Predicate<String> p1,Predicate<String> p2,String str) {System.out.println(p1.or(p2).test(str) ? "可能包含Z 或者 可能 包含Y" : "不包含Z 不包含Y");}/*** 使用Lambda表达式判断一个字符中,可能不包含Q* 使用了Predicate 中的* default Predicate<T> negate() {*         return (t) -> !test(t);*     } **/private static void testNegate(Predicate<String> p1, String str) {System.out.println(p1.negate().test(str) ? "不包含Q" : "包含Q");}
}

相关文章:

Java—JDK8新特性—函数式接口【内含思维导图】

目录 3.函数式接口 思维导图 3.1 什么是函数式接口 3.2 functionalinterface注解 源码分析 3.3 Lambda表达式和函数式接口关系 3.4 使用函数式接口 3.5 内置函数式接口 四大核的函数式接口区别 3.5.1 Supplier 函数式接口源码分析 3.5.2 Supplier 函数式接口使用 3.…...

【MySQL】外键约束和外键策略

一、什么是外键约束&#xff1f; 外键约束&#xff08;FOREIGN KEY&#xff0c;缩写FK&#xff09;是用来实现数据库表的参照完整性的。外键约束可以使两张表紧密的结合起来&#xff0c;特别是针对修改或者删除的级联操作时&#xff0c;会保证数据的完整性。 外键是指表…...

3. SQL底层执行原理详解

一条SQL在MySQL中是如何执行的 1. MySQL的内部组件结构1.1 Server层1.2 Store层 2. 连接器3. 分析器4. 优化器5. 执行器6. bin-log归档 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 1. MySQL的内部组件结…...

Bus动态刷新

Bus动态刷新全局广播配置实现 启动 EurekaMain7001ConfigcenterMain3344ConfigclientMain3355ConfigclicntMain3366 运维工程师 修改Gitee上配置文件内容&#xff0c;增加版本号发送POST请求curl -X POST "http://localhost:3344/actuator/bus-refresh" —次发送…...

逆波兰式的写法

一、什么是波兰式&#xff0c;逆波兰式和中缀表达式 6 *(37) -2 将运算数放在数值中间的运算式叫做中缀表达式 - * 6 3 7 2 将运算数放在数值前间的运算式叫做前缀表达式 6 3 7 * 2 - 将运算数放在数值后间的运算式叫做后缀表达式 二、生成逆波兰表达式 6 *(37) -2 生成…...

Linux系统日志介绍

Linux系统日志都是放在“/var/log”目录下面&#xff0c;各个日志文件的功能&#xff1a; /var/log/messages — 包括整体系统信息&#xff0c;其中也包含系统启动期间的日志。此外&#xff0c;mail&#xff0c;cron&#xff0c;daemon&#xff0c;kern和auth等内容也记录在va…...

第三十二章 React路由组件的简单使用

1、NavLink的使用 一个特殊版本的 Link&#xff0c;当它与当前 URL 匹配时&#xff0c;为其渲染元素添加样式属性 <NavLink className"list-group-item" to"/home">Home</NavLink> <NavLink className"list-group-item" to&quo…...

“裸奔”时代下,我们该如何保护网络隐私?

当我们在互联网上进行各种活动时&#xff0c;我们的个人信息和数据可能会被攻击者窃取或盗用。为了保护我们的隐私和数据安全&#xff0c;以下是一些实用的技巧和工具&#xff0c;可以帮助您应对网络攻击、数据泄露和隐私侵犯的问题&#xff1a; 使用强密码&#xff1a;使用独特…...

c#笔记-方法

方法 方法定义 方法可以将一组复杂的代码进行打包。 声明方法的语法是返回类型 方法名 括号 方法体。 void Hello1() {for (int i 0; i < 10; i){Console.WriteLine("Hello");} }调用方法 方法的主要特征就是他的括号。 调用方法的语法是方法名括号。 He…...

054、牛客网算法面试必刷TOP101--堆/栈/队列(230509)

文章目录 前言堆/栈/队列1、BM42 用两个栈实现队列2、BM43 包含min函数的栈3、BM44 有效括号序列4、BM45 滑动窗口的最大值5、BM46 最小的K个数6、BM47 寻找第K大7、BM48 数据流中的中位数8、BM49 表达式求值 其它1、se基础 前言 提示&#xff1a;这里可以添加本文要记录的大概…...

怎么让chatGTP写论文-chatGTP写论文工具

chatGTP如何写论文 ChatGPT是一个使用深度学习技术训练的自然语言处理模型&#xff0c;可以用于生成自然语言文本&#xff0c;例如对话、摘要、文章等。作为一个人工智能技术&#xff0c;ChatGPT可以帮助你处理一些文字内容&#xff0c;但并不能代替人类的创造性思考和判断。以…...

springboot 断点上传、续传、秒传实现

文章目录 前言一、实现思路二、数据库表对象二、业务入参对象三、本地上传实现三、minio上传实现总结 前言 springboot 断点上传、续传、秒传实现。 保存方式提供本地上传&#xff08;单机&#xff09;和minio上传&#xff08;可集群&#xff09; 本文主要是后端实现方案&…...

2023河南省赛vp题解

目录 A题&#xff1a; B题 C题 D题 E题 F题 G题 H题 I题 J题 K题 L题 A题&#xff1a; 1.思路&#xff1a;考虑暴力枚举和双hash&#xff0c;可以在O(n)做完。 2.代码实现&#xff1a; #include<bits/stdc.h> #define sz(x) (int) x.size() #define rep(i,z,…...

港科夜闻|香港科大与香港资管通有限公司签署校企合作备忘录,成立校企合作基金促科研成果落地...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港资管通有限公司签署校企合作备忘录&#xff0c;成立校企合作基金促科研成果落地。“港科资管通领航基金”28日在香港成立&#xff0c;将致力于推动高校科研成果转化&#xff0c;助力香港国际创科中心建设。…...

Neo4j 笔记

启动命令 neo4j console Cypher句法由四个不同的部分组成&#xff0c; 每一部分都有一个特殊的规则&#xff1a; start——查找图形中的起始节点。 match——匹配图形模式&#xff0c; 可以定位感兴趣数据的子图形。 where——基于某些标准过滤数据。 return——返回感兴趣的…...

数据库基础应用——概念模型

1、实体(Entity) 客观存在并可相互区别的事物称为实体。实体可以是人、物、对象、概念、事物本身、事物之间的联系。&#xff08;例如一名员工、一个部门、一辆汽车等等。&#xff09; 2、属性(Attributre) 实体所具有的每个特性称为属性。&#xff08;例如&#xff1a;员工由员…...

【学姐面试宝典】前端基础篇Ⅴ——JS深浅拷贝、箭头函数、事件监听等

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【前端面试专栏】 今天继续学习前端面试题相关的知识&#xff01; 感兴趣的小伙伴一起来看看吧~&#x1f91e; 文章目录 什么是事件监听事件委托以及冒泡原理介绍一下 promise&#…...

最新研究,GPT-4暴露了缺点!无法完全理解语言歧义!

夕小瑶科技说 原创作者 |智商掉了一地、Python自然语言推理&#xff08;Natural Language Inference&#xff0c;NLI&#xff09;是自然语言处理中一项重要任务&#xff0c;其目标是根据给定的前提和假设&#xff0c;来判断假设是否可以从前提中推断出来。然而&#xff0c;由于…...

商业数据挖掘-第一章-数据探索式分析-1

数据探索最基本的步骤之一是获取对数据的基本描述,通过获取对数据的基本描述从而获得对数据的基本感觉。下面的一些方法用于帮助我们认识数据。 我们使用波士顿房价预测的数据集进行实验 DataFrame.describe():查看数据的基本分布,具体是对每列数据进行统计,统计值包含频…...

MybatisPlus是否防止SQL注入?

问 如果我希望使用mybatisplus同时也进行防SQL注入操作&#xff0c;应该怎么处理&#xff1f; 答 如果你想在使用 MyBatis-Plus 进行数据库操作的同时也进行防 SQL 注入处理&#xff0c;可以采用以下两种方式&#xff1a; 使用 #{} 占位符&#xff1a;在 QueryWrapper 或 Up…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...