Java函数式接口
3 函数式接口
3.1 函数式接口概述
-
函数式接口:有且仅有一个抽象方法的接口
-
Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口只有确保接口中有且仅有一个抽象方法, Java中的Lambda才能顺利地进行推导
-
如何检测一个接口是不是函数式接口呢?
@FunctionalInterface- 放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败
-
注意:我们自己定义函数式接口的时候,@Functionallnterface是可选的, 就算我不写这个注解,只要保证满足函数式接口定义的条件,也照样是函数式接口。但是,建议加上该注解
3.2 函数式接口作为方法的参数
- 需求

package test;public class Demo {public static void main(String[] args) {//匿名内部类startThread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "线程启动了"); //Thread-0线程启动了}});//Lambda表达式startThread(() -> System.out.println(Thread.currentThread().getName() + "线程启动了")); //Thread-1线程启动了}public static void startThread(Runnable r) { //Runnable为函数式接口,上方有@FunctionalInterface
// Thread t = new Thread(r);
// t.start();new Thread(r).start();}
}
- 如果方法的参数是函数式接口,可以使用Lambda表达式作为参数传递
startThread(() -> System.out.println(Thread.currentThread().getName() + "线程启动了"));
3.3 函数式接口作为方法的返回值
- 需求

package test;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;public class Demo {public static void main(String[] args) {//构造使用场景//定义一个集合存储字符串ArrayList array = new ArrayList();array.add("cccc");array.add("aa");array.add("b");array.add("dd");System.out.println("排序前:"+array); //排序前:[cccc, aa, b, dd]Collections.sort(array); //排序后:[aa, b, cccc, dd]Collections.sort(array,getComparator()); //排序后:[b, aa, dd, cccc]System.out.println("排序后:"+array);}public static Comparator<String> getComparator() {//匿名内部类
// Comparator<String> comp = new Comparator<String>() {
// @Override
// public int compare(String s1, String s2) {
// return s1.length()-s2.length();
// }
// };
// return comp;// return new Comparator<String>() {
// @Override
// public int compare(String s1, String s2) {
// return s1.length()-s2.length();
// }
// };//Lambda表达式
// return (String s1,String s2) ->{
// return s1.length()-s2.length();
// };return(s1,s2) -> s1.length()-s2.length();}
}
- 如果方法的返回值是函数式接口,可以使用Lambda表达式作为结果返回
public static Comparator<String> getComparator() {return(s1,s2) -> s1.length()-s2.length();
}
3.4 常用函数式接口
- Java 8在
java.util.function包下预定义了大量的函数式接口供我们使用 - 重点来学习下面的4个接口
- Supplier [səˈplaɪər] 接口
- Consumer [kənˈsuːmər] 接口
- Predicate[ˈpredɪkət] 接口
- Function接口
3.4.1 Supplier接口
Supplier<T>:包含一个无参的方法T get()方法:获得结果- 该方法不需要参数, 它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
Supplier<T>接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get()方法就会生产什么类型的数据供我们使用
package test;import java.util.function.Supplier;public class Demo {public static void main(String[] args) {
// String s = getString(() -> {
// return "小黑";
// });String s = getString(() -> "小黑");System.out.println(s); //小黑int i = getInteger(() -> 10);System.out.println(i); //10}//定义一个方法,返回字符数据public static String getString(Supplier<String> sup) {return sup.get();}//定义一个方法,返回整数数据public static Integer getInteger(Supplier<Integer> sup) {return sup.get();}
}
- 练习

package test;import java.util.function.Supplier;public class Demo {public static void main(String[] args) {int[] arr = {22, 55, 11, 44, 33};int maxValue = getMax(() -> {int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;});System.out.println(maxValue); //55}public static int getMax(Supplier<Integer> sup) {return sup.get();}
}
3.4.2 Consumer接口
Consumer<T>接口也被称为消费型接口,它消费的数据的数据类型由泛型指定- Consumer :包含两个方法
| 方法名 | 说明 |
|---|---|
| void accept(T t) [əkˈsept] | 对给定的参数执行此操作 |
default Consumer<T> andThen(Consumer after) | 返回一个组合的Consumer,依次执行此操作,然后执行after操作 |
- 范例
package test;import java.util.function.Consumer;public class Demo {public static void main(String[] args) {
// operatorString("小白",(String s)->{
// System.out.println(s); //小白
// });operatorString("小白",s-> System.out.println(s)); //小白// operatorString("小黑",System.out::println); //小黑// operatorString("大熊猫",s -> {
// System.out.println(new StringBuilder(s).reverse().toString()); //猫熊大
// });operatorString("大熊猫",s -> System.out.println(new StringBuilder(s).reverse().toString())); //猫熊大System.out.println("---------");operatorString("小熊猫",s -> System.out.println(s),s -> System.out.println(new StringBuilder(s).reverse().toString()));
// 小熊猫
// 猫熊小}//定义一个方法,用不同的方式消费同一个字符串数据两次private static void operatorString(String name, Consumer<String> con1,Consumer<String> con2) {//1,void accept(T t) [əkˈsept] 对给定的参数执行此操作
// con1.accept(name);
// con2.accept(name);//2,Consumer<T> andThen(Consumer after) 返回一个组合的Consumer,依次执行此操作,然后执行after操作con1.andThen(con2).accept(name);}//定义一个方法,消费一个字符串数据private static void operatorString(String name, Consumer<String> con) {con.accept(name);}
}
- 练习

package test;import java.util.function.Consumer;public class Demo {public static void main(String[] args) {String[] strArray = {"小白,10", "小黑,20"};
// printInfo(strArray,(String str) ->{
// String name = str.split(",")[0];
// System.out.print("姓名:"+name);
// },(String str)->{
// int age = Integer.parseInt(str.split(",")[1]);
// System.out.println(",年龄:"+age);
// });//姓名:小白,年龄:10//姓名:小黑,年龄:20printInfo(strArray, str -> System.out.print("姓名:" + str.split(",")[0]),str -> System.out.println(",年龄:" + Integer.parseInt(str.split(",")[1])));}private static void printInfo(String[] strArray, Consumer<String> con1, Consumer<String> con2) {for (String str : strArray) {con1.andThen(con2).accept(str);}}
}
3.4.3 Predicate [predɪkeɪt] 接口
Predicate<T>接口通常用于判断参数是否满足指定的条件- 常用的四个方法
| 方法名 | 说明 |
|---|---|
| boolean test(T t) | 对给定的参数进行判断(判断逻辑由Lambda表达式实现,返回一个布尔值 |
default Predicate<T> negate() | 返回一个逻辑的否定,对应逻辑非 |
default Predicate <T> and(Predicate other) | 返回一个组合判断,对应短路与 |
default Predicate <T> or(Predicate other) | 返回一个组合判断,对应短路或 |
- 范例
package test;import java.util.function.Predicate;public class Demo {public static void main(String[] args) {
// boolean b1 = checkString("hello",(String s) ->{
// return s.length()>8;
// });boolean b1 = checkString("hello", s -> s.length() > 8);System.out.println(b1); //1:false,2:trueboolean b2 = checkString("hello",s->s.length()>8,s -> s.length()<15);System.out.println(b2); //3:false,4:trueboolean b3 = checkString("hellojava",s->s.length()>8,s -> s.length()<15);System.out.println(b3); //3:true,4:true}//判断给定的字符串是否满足要求private static boolean checkString(String s, Predicate<String> pre) {//1,boolean test(T t) 对给定的参数进行判断(判断逻辑由L ambda表达式实现,返回一个布尔值
// return pre.test(s);
// return !pre.test(s); //输出相反的,不过用下一个方法//2,default Predicate<T> negate() 返回一个逻辑的否定,对应逻辑非return pre.negate().test(s);}//同一个结果给出两个不同的判断条件,最后把这两个判断结果做逻辑与的结果作为最终结果private static boolean checkString(String s,Predicate<String> pre1,Predicate<String> pre2) {
// boolean b1 = pre1.test(s);
// boolean b2 = pre2.test(s);
// boolean b = b1 && b2;
// return b;//3,default Predicate <T> and(Predicate other) 返回一个组合判断,对应短路与
// return pre1.and(pre2).test(s); //源码:return (t) -> test(t) && other.test(t);//default Predicate <T> or(Predicate other) 返回一个组合判断,对应短路或return pre1.or(pre2).test(s); //源码:return (t) -> test(t) || other.test(t);}
}
- 练习

package test;import java.util.ArrayList;
import java.util.function.Predicate;public class Demo {public static void main(String[] args) {String[] strArray = {"小黑,50", "大熊猫,40", "小白,20", "奥特曼,100"};ArrayList<String> array = myFilter(strArray, s -> s.split(",")[0].length() > 2,s -> Integer.parseInt(s.split(",")[1]) > 33);for(String str:array) {System.out.println(str);
// 大熊猫,40
// 奥特曼,100}}public static ArrayList<String> myFilter(String[] strArray, Predicate<String> pre1, Predicate<String> pre2) {//定义一个集合ArrayList<String> array = new ArrayList<String>();//遍历数组for (String str : strArray) {if (pre1.and(pre2).test(str)) {array.add(str);}}return array;}
}
3.4.4 Function接口
Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值- 常用的两个方法
| 方法名 | 说明 |
|---|---|
| R apply(T t) | 将此函数应用于给定的参数 |
default <V> Function andThen(Function after) | 返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果 |
- 案例
package test;import java.util.function.Function;public class Demo {public static void main(String[] args) {convert("100", s -> Integer.parseInt(s)); //100
// convert("100",Integer::parseInt); //100convert(100, i -> String.valueOf(i + 566)); //666convert("100", s -> Integer.parseInt(s), i -> String.valueOf(i + 566)); //666}//定义一个方法,把一个字符串转换成int类型,在控制台输出public static void convert(String s, Function<String, Integer> fun) {//1,R apply(T t) 将此函数应用于给定的参数
// Integer i = fun.apply(s);int i = fun.apply(s);System.out.println(i);}//定义一个方法,把一个int类型的数据加上一个整数之后,转换为字符串在控制台输出public static void convert(int i, Function<Integer, String> fun) {String s = fun.apply(i);System.out.println(s);}//定义一个方法,把一个字符串转换成int类型,把int类型的数据加上一个整数之后,转换为字符串在控制台输出public static void convert(String s, Function<String, Integer> fun1, Function<Integer, String> fun2) {//Integer i = fun.apply(s);//String ss = fun.apply(i);//2,default <V> Function andThen(Function after) 返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果String ss = fun1.andThen(fun2).apply(s);//源码:return (T t) -> after.apply(apply(t));相当于上两步System.out.println(ss);}
}
- 练习

package test;import java.util.function.Function;public class Demo {public static void main(String[] args) {String s = "小黑,20";convert(s, ss -> ss.split(",")[1], ss -> Integer.parseInt(ss), i -> i + 70); //90}public static void convert(String s, Function<String, String> fun1, Function<String, Integer> fun2, Function<Integer, Integer> fun3) {int i = fun1.andThen(fun2).andThen(fun3).apply(s);System.out.println(i);}
}
相关文章:
Java函数式接口
3 函数式接口 3.1 函数式接口概述 函数式接口:有且仅有一个抽象方法的接口 Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口只有确保接口中有且仅有一个抽象方法, Java中的Lambda才能顺利地进行推导…...
安装libevent库
安装libevent库 yum install libevent libevent-devel 自动安装Memcached yum install memcached 源码安装 下载1.6.19版本 wget https://www.memcached.org/files/memcached-1.6.19.tar.gz (若证书过期yum install -y ca-certificates) 解压源码 tar -zxvf…...
vue 截取字符串的方法
vue中的字符串方法,我目前使用最多的是下面两种方法,因为 vue的字符串方法支持断言操作。 1、 vue中截取字符串的方法如下: 2、 vue中截取字符串的方法,这个方法也是需要依赖于 vue库提供的支持。 3、 vue中截取字符串的方法&…...
可数集和不可数集
有限集和无限集 后继集 设 S S S是任一集合,称 S S ∪ { S } S^ S\cup \left\{ S\right\} SS∪{S}为 S S S的后继集 自然数集 自然数集 N \mathbb{N} N的归纳定义是: (1) ∅ ∈ N \empty \in \mathbb{N} ∅∈N (…...
<Linux>《Linux 之 ps 命令详解大全(含实用命令)》
《Linux 之 ps 命令详解大全(含实用命令)》 1 常用命令1.1 显示所有当前进程1.2 显示所有当前进程1.3 显示所有当前进程1.4 根据用户过滤进程1.5 根据 CPU 使用来升序排序1.6 根据用户过滤进程1.7 查询全10个使用cpu和内存最高的应用1.8 通过进程名和PID…...
华为OD机试真题 Java 实现【寻找关键钥匙】【2023Q1 100分】
一、题目描述 小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成)的箱子,并给出箱子编号,箱子编号为1~N。 每个箱子中都有一个字符串s,字符串由大写字母,小写字母,数字,标点符号,空格组成,需要在这些字符串中找出所有的字母…...
项目中遇到的一些问题总结(十三)
extension-configs 和 shared-configs 的区别 在 Nacos 配置管理中,extension-configs 和 shared-configs 分别是两种不同类型的配置,它们的主要区别在于它们的使用场景和作用。 extension-configs 是一种应用程序向 Nacos 注册的扩展配置。它主要用于给…...
药品存销信息管理系统数据设计与实现(包括需求分析,数据库设计,数据表、视图、存储过程等)
前言 可前往链接直接下载: https://download.csdn.net/download/c1007857613/87776664 或者阅读本博文的详细介绍,本博文也包含所有详细内容。 一、需求分析 a.“药品存销信息管理系统”只是对数据库应用技术的一个样本数据库的实例,重在对数据库一些方法的熟悉与掌握,…...
PyTorch-Loss Function and BP
目录 1. Loss Function 1.1 L1Loss 1.2 MSELoss 1.3 CrossEntropyLoss 2. 交叉熵与神经网络模型的结合 2.1 反向传播 1. Loss Function 目的: a. 计算预测值与真实值之间的差距; b. 可通过此条件,进行反向传播。 1.1 L1Loss import torch from …...
centos docker安装mysql8
1、创建挂载文件夹 mkdir -p /mydata/mysql/log mkdir -p /mydata/mysql/data mkdir -p /mydata/mysql/conf 2、拉取镜像最新版本,如果写 mysql:8.0.26可以指定版本 docker pull mysql 3、启动命令 docker run -p 3306:3306 --restartalways -v /mydata/mysql/log:…...
Java中synchronized锁的深入理解
使用范围 synchronized使用上用于同步方法或者同步代码块在锁实现上是基于对象去实现使用中用于对static修饰的便是class类锁使用中用于对非static修饰的便是当前对象锁 synchronized的优化 在jdk1.6中对synchronized做了相关的优化 锁消除 在synchronized修饰的代码块中…...
Find My资讯|iOS17将重点改进钱包、Find My、SharePlay和AirPlay等功能
彭博社的马克・古尔曼(Mark Gurman)在最新一期 Power On 时事通讯中表示,苹果即将推出的 iOS 17 系统将改进 Wallet、Find My、SharePlay 和 AirPlay 等多项功能。 古尔曼在博文中还表示苹果会增强 Find My 的位置服务,同样也没…...
什么是webSocket?
什么是webSocket WebSockets是一种协议,它允许在Web应用程序中建立持久连接。这意味着当客户端与服务器建立连接后,它们可以始终保持连接状态,直到其中一个终止连接。相比于传统的HTTP协议,WebSockets提供了更高效的方式来处理实…...
黑马Redis视频教程高级篇(一:分布式缓存)
目录 分布式缓存 一、Redis持久化 1.1、RDB持久化 1.1.1、执行时机 1.1.2、RDB原理 1.1.3、小结 1.2、OF持久化 1.2.1、AOF原理 1.2.2、OF配置 1.2.3、AOF文件重写 1.3、RDB与AOF对比 二、Redis主从 2.1、搭建主从架构 2.1.1、集群结构 2.1.2、准备实例和配置 …...
SLMi331数明深力科带DESAT保护功能隔离驱动应用笔记
SLMi33X系列SLMi331数明深力科首款单通道带DESAT保护功能的IGBT/SiC隔离驱动器。内置快速去饱和(DESAT) 故障检测功能、米勒钳位功能、漏极开路故障反馈、软关断功能以及可选择的自恢复模式,兼容光耦隔离驱动器。 SLMi331的DESAT阈值为6.5V,其最大驱动电…...
【嵌入式Linux基础】启动初始化程序--init程序
文章目录 内核启动后初始化程序简介BusyBox initBuildroot init 脚本 后记 内核启动后 内核引导代码在initramfs中通过内核命令行中的root指定的文件系统中去寻找根系统文件,并执行一个相应的程序。在默认情况下,对于initramfs这个程序是/init࿰…...
基于Java实现农产品交易平台的设计与实现_kaic
【摘要】农业是我国国民经济的重要组成部分,随着信息化的普及,4G网络、光纤以及5G网络也日益完善,农业信息化的发展成为了必然。同时,由于本年疫情原因,导致农作物积压销售,甚至腐烂造成不必要的浪费&#…...
视频转换、视频压缩、录屏等工具合集:迅捷视频工具箱
这是一款功能强大的视频处理软件,提供了多种视频处理功能。可以使用该软件进行视频剪辑、视频转换、音频转换、视频录像、视频压缩、字幕贴图等多种操作。软件界面简洁易用,操作方便,可以满足各种视频处理需求。 基本功能 视频压缩ÿ…...
理解时序数据库的时间线
在当今数据爆炸的时代,时序数据已经成为企业和组织中不可或缺的一部分。它们包括了从传感器、监控设备、日志记录系统和金融交易等多种来源的大量数据,这些数据按照时间顺序排列,记录了各种事件和活动的发生和变化。时序数据的分析和处理对于…...
音视频技术开发周刊 | 295
每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 微软炸通Windows与ChatGPT全家桶!人手一个Copilot,AI宇宙降临 三位OpenAI掌舵人亲自撰文:我们应该如何治理超级智能? OpenA…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
