当前位置: 首页 > 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…...

5月第1周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

飞瓜轻数发布2023年5月1日-5月7日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站…...

数据的插入删除和更新

在之前我们就已经学过了数据的插入&#xff0c;在这里再进行一点内容的补充&#xff1a; 在insert语句中&#xff0c;value子句中参数的顺序与表中各个列的顺序是一一对应的。 mysql> insert into first_table(second_column, first_column) values(aaa, 1); Query OK, 1 r…...

C# byte[] 与 int 类型互转

本文讲述在C#中,怎样使用 BitConverter 类将字节数组转换为 int 然后又转换回字节数组的过程。 为什么需要这样呢&#xff1f;这是因为&#xff0c;比如说,在从网络读取字节之后&#xff0c;可能需要将字节转换为内置数据类型。 除了示例中的 ToInt32(Byte[], Int32) 方法之外…...

MySQL---多表联合查询(上)(多表关系、外键约束、学生成绩多表关系、交叉连接查询)

1. 多表关系 MySQL多表之间的关系可以概括为&#xff1a; 一对一&#xff1a; 比如&#xff1a;一个学生只有一张身份证&#xff1b;一张身份证只能对应一学生。 实现原则&#xff1a;在任一表中添加唯一外键&#xff0c;指向另一方主键&#xff0c;确保一对一关系。 一般一对…...

【iOS】—— RunLoop线程常驻和线程保活

文章目录 没有线程常驻会怎么样&#xff1f; 线程常驻线程保活 没有线程常驻会怎么样&#xff1f; 我们一般写一个子线程&#xff0c;子线程执行完分配的任务后就会自动销毁&#xff0c;比如下面这个情况&#xff1a; 我们先重写一下NSThread里面的dealloc方法&#xff0c;打印…...

Springcloud--docker快速入门

认识docker docker相关操作 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署…...

基于AT89C51单片机的电子计数器设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87770826 源码获取 主要内容&#xff1a; 设计一个电子计时器&#xff0c;数码管初始显示值为“00”&#xff0c;每隔1s电子秒表加1&#xff1b;秒计数到60时清0&a…...

IT程序员如何面对35岁大龄问题?我从公司老板的角度聊聊

很多从事IT行业的人一想到35岁就很焦虑&#xff0c;担心自己被公司裁员后找不到工作。同时还有家庭责任加身&#xff0c;担心中年失业后晚年生活。作为一位公司老板&#xff0c;我想从我的角度谈一下这个问题。 首先&#xff0c;我本质上不介意我的员工年龄&#xff0c;无论是…...

【计算机专业漫谈】【计算机系统基础学习笔记】W2-2-2 模运算系统和补码表示

利用空档期时间学习一下计算机系统基础&#xff0c;以前对这些知识只停留在应试层面&#xff0c;今天终于能详细理解一下了。参考课程为南京大学袁春风老师的计算机系统基础MOOC&#xff0c;参考书籍也是袁老师的教材&#xff0c;这是我的听课自查资料整理后的笔记 补码表示法…...

vue概述

vue2和vue3的区别 vue2和vue3区别 NOvue2vue31 optinos Api写法 比较分散 Compostiton Api 代码集 2重写数序双向绑定通过Object.defineProperty&#xff08;&#xff09;实现 基于Proxy实现 对数组有了更好的支持 3Fragments 1&#xff0c;在template中只能一个div 2&#xf…...