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…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
python基础语法Ⅰ
python基础语法Ⅰ 常量和表达式变量是什么变量的语法1.定义变量使用变量 变量的类型1.整数2.浮点数(小数)3.字符串4.布尔5.其他 动态类型特征注释注释是什么注释的语法1.行注释2.文档字符串 注释的规范 常量和表达式 我们可以把python当作一个计算器,来进行一些算术…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...
