函数式接口

文章目录

  • 函数式接口
    • 函数式接口当做方法的参数
    • 函数式接口作为返回值
    • 生产者接口 - Supplier
    • 消费者接口 - Consumer
      • 使用方式:
      • 案例:字符串拆分
    • 判断接口 - Predicate
      • 使用方式
      • 应用场景
    • 加工接口 - Function

函数式接口

只有一个抽象方法的接口,转为lambda而生的接口
接口带有==@FunctionalInterface==

函数式接口当做方法的参数

案例:通过Runnable创建线程,把Runnable接口当做参数进行传递

package com.itxs.demo08;/*** @Classname : demo01* @Description : TODO 函数式接口当做参数进行传递* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {// 案例:创建线程// 方式一:匿名内部类的形式MyThread(new Runnable() {@Overridepublic void run() {System.out.println("我是匿名内部类的方式创建的线程");}});// 方式二:完整的lambdaMyThread(()->{System.out.println("完整的lambda创建的线程");});// 省略的lambdaMyThread(()-> System.out.println("省略的lambda创建的线程"));}private static void MyThread(Runnable r){new Thread(r).start();}
}

运行结果:
在这里插入图片描述

函数式接口作为返回值

案例:字符串长度比较进行排序

package com.itxs.demo08;import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;/*** @Classname : demo02* @Description : TODO 字符串的长度进行比较* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {// 定义一个String类型集合ArrayList<String> list = new ArrayList<>();// 添加元素list.add("123456555557");list.add("1234568");list.add("123456789");list.add("56789");//调用方法Collections.sort(list);// 自然规则进行排序for (String s : list) {System.out.println(s);}System.out.println("========================");Collections.sort(list,getCompare());// getCompare返回设置的比较器// 遍历集合for (String a:list) {System.out.println(a);}}/*** 设置比较器的排序规则* @return 返回一个Comparator接口*/private static Comparator<String> getCompare() {// 匿名内部类的方式
//        return new Comparator<String>() {
//            @Override
//            public int compare(String o1, String o2) {
//                return o1.length() - o2.length(); // 根据字符串长度进行比较 短的在前面
//            }
//        };// 通过lambda的方式return (o1,o2)->o1.length() - o2.length();// 引用方式//  return Comparator.comparingInt(String::length);}
}

运行结果:
在这里插入图片描述

生产者接口 - Supplier

Supplier

是一个生产者接口,用来生产数据,通常返回的是一个数据(可以使用Lambda表达式)

通过Supplier返回一个字符串和找到数组中的最大值

package com.itxs.demo08;import java.util.function.Supplier;/*** @Classname : demo01* @Description : TODO supplier生产者接口* @Author : lin_refuel@qq.com*/
public class demo01 {public static void main(String[] args) {// 生产一个数据// 匿名内部类重写
//        String str = getString(new Supplier<String>() {
//            @Override
//            public String get() {
//                return "我是字符串";
//            }
//        });// lambda形式
//        String str = getString(()->{
//            return "我是一个字符串";
//        });// lambda省略方式String str = getString(()->"我是字符串".substring(2,4));System.out.println(str);//======================================================// 定义一个数组找到数组中的最大值int[] array = {1,2,3,4,5,6,7,8,9,10};int max = getMax(()->{int Max = array[0];for (int i = 1; i < array.length; i++) {if(Max < array[i])Max = array[i];}return Max;});System.out.println("最大值Max = " + max);}/*** 找出最大值* @param sp Supplier接口,重写并调用里面抽象方法get* @return 最大值*/private static Integer getMax(Supplier<Integer> sp) {return sp.get();}/*** 字符串返回* @param sp Supplier接口,重写并调用里面抽象方法get* @return 字符串*/public static String getString(Supplier<String> sp) {return sp.get();}
}

运行结果:
在这里插入图片描述

消费者接口 - Consumer

是一个消费者接口,针对于数据做一些提取的操作,不需要返回值

使用方式:

demo: 对字符串进行操作

package com.itxs.demo08;import java.util.function.Consumer;/*** @Classname : demo02* @Description : TODO* @Author : lin_refuel@qq.com*/
public class demo02 {public static void main(String[] args) {// 匿名内部类consumptionCharacters("小肆", new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("你的名字是: " + s);}});// lambda方式consumptionCharacters("小三",(str)->{System.out.println("你的名字反过来是:" + new StringBuilder(str).reverse());});//=======================================================================// Consumer连续消费,例如操作同一个字符串consumer02("小三",(str)-> System.out.println(str),(str)-> System.out.println(new StringBuilder(str).reverse()));}private static void consumptionCharacters(String str, Consumer<String> con){con.accept(str);}private static void consumer02(String str,Consumer<String> con01,Consumer<String> con02){// con01.accept(str);//01//con02.accept(str);//02con01.andThen(con02).accept(str);// 这行代码==上面的01和02缩写}
}

运行结果:
在这里插入图片描述

案例:字符串拆分

package com.itxs.demo08;import java.util.function.Consumer;/*** @Classname : demo03* @Description : TODO Consumer - 应用场景* @Author : lin_refuel@qq.com*/
public class demo03 {public static void main(String[] args) {// 定义一个数组String[] name = {"东邪:黄固","西毒:欧阳锋","南帝:段智兴","北丐:洪七公","中神通:王重阳"};// 通过Consumer接口使其分开separate(name,(info)->{// info.split(":")[0]; 相当于是把字符串拆分成了字符数组,取下标为0的String outerNumber = info.split(":")[0];System.out.println("绰号:" + outerNumber);},(info)->{String originalName = info.split(":")[1];System.out.println("真名:" + originalName);});}private static void separate(String[] info, Consumer<String> con01,Consumer<String> con02){for (String s : info) {// 两个接口对同一个数组进行操作con01.andThen(con02).accept(s);System.out.println("=========================");}}
}

在这里插入图片描述

判断接口 - Predicate

使用方式

通常用于判断参数是否满足指定的条件

demo: 判断参数字符串的长度是否满足条件

package com.itxs.demo08;import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import java.util.function.Predicate;/*** @Classname : demo04* @Description : TODO 判断接口  -Predicate<>()* @Author : lin_refuel@qq.com*/
public class demo04 {public static void main(String[] args) {// Predicate接口的使用方式boolean b01 = res("JavaSE Linux MySQL redis", (str) -> {return str.length() > 10;// 判断字符串的长度是否超过10});System.out.println(b01); // 输出返回值System.out.println("===================================");boolean b02 = res("JavaSE Linux MySQL redis",str -> str.length()>20, // 字符串的长度是否超过20str -> str.length() < 30); // 字符串的长度是小于30System.out.println(b02);}/***  根据字符串的是否符合要求来进行返回* @param str 目标字符串* @param p01 判断接口* @return 一个true or false*/private static boolean res(String str,Predicate<String> p01){//return p01.test(str); // true// !return p01.test(str);// 逻辑非return p01.negate().test(str); // 等于上一个行}/*** 多重判断条件* @param str 目标字符串* @param p01 判断条件接口1* @param p02 判断条件接口2* @return false or true*/private static boolean res(String str,Predicate<String> p01,Predicate<String> p02){//return p01.test(str) && p02.test(str);return p01.and(p02).test(str); // 逻辑与 等同于上面一行}
}

运行结果:
在这里插入图片描述

应用场景

筛选数据 - 找出年龄超过40的,名字是三个字的

package com.itxs.demo08;import java.util.ArrayList;
import java.util.function.Predicate;/*** @Classname : demo05* @Description : TODO Predicate - 应用场景 (筛选数据)* @Author : lin_refuel@qq.com*/
public class demo05 {public static void main(String[] args) {// 定义一个字符串数组 , 中原五绝的姓名和年龄String[] name = {"黄固,29","欧阳锋,31","段智兴,35","洪七公,43","王重阳,46"};// 找出名字长度为3 年龄超过40的ArrayList<String> res01 = res(name, (s) -> {return s.split(",")[0].length() == 3;// 判断分离的字符串长度是否为3}, (s) -> {return Integer.parseInt(s.split(",")[1]) > 40;});System.out.println(res01);}private static ArrayList<String> res(String[] name, Predicate<String> p01,Predicate<String> p02){ArrayList<String> list = new ArrayList<>();// 一个空的集合for (String s : name) {if(p01.and(p02).test(s)){list.add(s); // 满足条件进行添加}}return list;// 返回集合}

运行结果:
在这里插入图片描述

加工接口 - Function

接收一个参数,并产生一个结果

Function<T,R>:接口通常用于对参数进行处理,转换(处理逻辑有 啦么大 实现),然后返回一个新的值

demo:

package com.itxs.demo08;import java.util.function.Function;/*** @Classname : demo06* @Description : TODO 加工接口 - 用于数据转换* @Author : lin_refuel@qq.com*/
public class demo06 {public static void main(String[] args) {// 将字符串转换为Integer类型数据// lambda省略方式//conversion("9527",str->Integer.parseInt(str));// 引用方式conversion("9527", Integer::parseInt);System.out.println("==========================");// 将Integer类型数据转换为String类型// lambda省略写法//conversion(9527,integer -> String.valueOf(integer));// 引用写法conversion(9527, String::valueOf);System.out.println("==========================");// TODO ===========二次加工===========conversion("9527",s->Integer.parseInt(s+1),// Integer类型数据95271加工出来了s->String.valueOf(s+1)); // String类型数据 95272加工出来了}/*** 将String类型数据转为Integer类型** @param str  目标字符串* @param ft01 转换接口*/private static void conversion(String str, Function<String, Integer> ft01) {Integer res = ft01.apply(str); // 字符串9527转为了Integer类型9527System.out.println(res + 1);// 9527 + 1 = 9528}/*** 将Integer类型数据转字符串类型** @param integer 目标整数类* @param ft01    转换接口*/private static void conversion(Integer integer, Function<Integer, String> ft01) {String res = ft01.apply(integer); //Integer类型9527转成String类型 9527System.out.println(res + 1); // 9527 + 1 = 95271,相当于是字符串拼接}/*** 二次加工* 字符串转Integer ,Integer转字符串* @param str 目标字符串* @param ft01 字符串转Integer的接口* @param ft02 Integer转字符串的接口*/private static void conversion(String str, Function<String, Integer> ft01, Function<Integer, String> ft02) {String RES = ft01.andThen(ft02).apply(str);System.out.println(RES + 1); // String类型95272 + 1 = 952721}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/645653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(菜鸟自学)漏洞利用——MS11-080

&#xff08;菜鸟自学&#xff09;漏洞利用——MS11-080 漏洞简介利用漏洞对系统进行提权查看漏洞利用代码和工具将py脚本转换为exe程序渗透攻击验证 漏洞简介 MS11-080 是指微软于 2011 年发布的一个安全公告&#xff08;MS11-080&#xff09;&#xff0c;其中包含了关于 Win…

自动化网络故障管理

故障管理是网络管理的组成部分&#xff0c;涉及检测、隔离和解决问题&#xff0c;如果实施得当&#xff0c;网络故障管理可以使连接、应用程序和服务保持在最佳水平&#xff0c;提供容错能力并最大限度地减少停机时间&#xff0c;专门为此目的设计的平台或工具称为故障管理系统…

【并发编程】顺序控制交替输出abc

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程⛺️稳重求进&#xff0c;晒太阳 必须先2后1打印 用synchronized package aaa;public class Test2 {static Boolean hasExecutorfalse;public static void main(String[] args) …

1 - 搭建Redis数据库服务器|LNP+Redis

搭建Redis数据库服务器&#xff5c;LNPRedis 搭建Redis数据库服务器相关概念Redis介绍安装RedisRedis服务常用管理命令命令set 、 mset 、 get 、 mget命令keys 、 type 、 exists 、 del命令ttl 、 expire 、 move 、 flushdb 、flushall 、save、shutdown 配置文件解析 LNP …

Wordpress seo优化该怎么做?

Wordpress作为开源管理系统&#xff0c;目前已然是世界上最流行的cms之一&#xff0c;这不仅仅因为他开源&#xff0c;对用户友好&#xff0c;让任何人都能轻而易举的制作网站&#xff0c;更是因为这套程序对于搜索引擎非常友好&#xff0c;是做谷歌seo的不二之选 Wordpress作为…

【腾讯云服务器】幻兽帕鲁私服服务器部署保姆级教程

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或分解后食用。 想要部署属于自…

【服务器Midjourney】Midjourney网站0基础搭建

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建MJ】 🌼1. 给服务器添加端口 🌼2. 使用Xshell连接服务器 🌼3. 安装docker 🌼4. 安装Midjourney程序 🌼5. 绑定域名+申请SSL证书 🌼6. 更新网站

两数之和[中等]

一、题目 给你一个下标从1开始的整数数组numbers&#xff0c;该数组已按非递减顺序排列&#xff0c;请你从数组中找出满足相加之和等于目标数target的两个数。如果设这两个数分别是numbers[index1]和numbers[index2]&#xff0c;则1 < index1 < index2 < numbers.len…

【AI】深度学习与图像描述生成——看图说话(1)

还记得我闲来无事&#xff0c;用大模型来“洗图”吗&#xff0c;就是想抄袭别人的图&#xff0c;但是又要装作原创的样子。因为洗稿大家都熟悉&#xff0c;洗图其实也是一样的。 【AIGC】今天想用AI“洗个图”&#xff0c;失败了&#xff0c;进来看我怎么做的-CSDN博客 【AIG…

哈夫曼树(Huffman)

哈夫曼树 Huffman 编码问题 问题引入 什么是编码&#xff1f; 简单说就是建立【字符】到【数字】的对应关系&#xff0c;如下面大家熟知的 ASC II 编码表&#xff0c;例如&#xff0c;可以查表得知字符【a】对应的数字是十六进制数【0x61】 \000102030405060708090a0b0c0d…

php下curl发送cookie

目录 一&#xff1a;使用 CURLOPT_COOKIE 选项 二&#xff1a;CURLOPT_COOKIEFILE 三&#xff1a;CURLOPT_HTTPHEADER php curl发送cookie的几种方式,下面来介绍下 一&#xff1a;使用 CURLOPT_COOKIE 选项 通过设置 CURLOPT_COOKIE 选项&#xff0c;你可以将 cookie 字符…

用ChatGPT创作留学文书三阶玩法详解!

最近人工智能聊天工具Chagpt火爆全网&#xff0c;从闲聊到编程&#xff0c;文学到菜谱&#xff0c;似乎以一种无所不能的姿态推翻了早期“人工智障”的屈辱招牌&#xff0c;正逐步进入并改变我们生产生活方式。作为文字处理大师&#xff0c;如果让人工智能来执笔大学申请文书会…

Linux 下查看端口以及释放端口

目录 一、查看端口是否被占用 1、使用 netstat 命令 2、使用 lsof 命令 二、释放端口 1、使用kill命令 2、使用 fuser 命令 三、netstat 四、lsof 五、fuser 一、查看端口是否被占用 在 Linux 系统上&#xff0c;你可以使用 netstat 或 lsof 命令来查看端口是否被占用。…

串口WiFi模块简介、工作原理、工作方式等8大知识点

WiFi模块又名串口WiFi模块&#xff0c;属于物联网传输层&#xff0c;功能是将串口或TTL电平转为符合WiFi无线网络通信标准的嵌入式模块&#xff0c;内置无线网络协议IEEE802.11b.g.n协议栈以及TCP/IP协议栈。串口WIFI模块&#xff0c;体积小&#xff0c;功耗低&#xff0c;采用…

springboot124中药实验管理系统设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的中药实验管理系统设计与实现 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章…

【算法Hot100系列】合并区间

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

vue常用指令(v-if)

一、v-if 指令 作用: 根据表达值的真假,切换元素的显示和隐藏( 操纵dom 元素 ) 二、代码演示 1、v-if 设置条件&#xff0c;添加按键修改状态 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta na…

运用ETLCloud快速实现数据清洗、转换

一、数据清洗和转换的重要性及传统方式的痛点 1.数据清洗的重要性 数据清洗、转换作为数据ETL流程中的转换步骤&#xff0c;是指在数据收集、处理、存储和使用的整个过程中&#xff0c;对数据进行检查、处理和修复的过程&#xff0c;是数据分析中必不可少的环节&#xff0c;对…

C/C++ - Auto Reference

目录 auto Reference auto 当使用auto​​关键字声明变量时&#xff0c;C编译器会根据变量的初始化表达式推断出变量的类型。 自动类型推断&#xff1a;auto​​关键字用于自动推断变量的类型&#xff0c;使得变量的类型可以根据初始化表达式进行推导。 初始化表达式&#x…

初学数据结构:二叉树相关oj题

目录 1. 相同的树2. 另一棵树的子树3. 翻转二叉树4. 平衡二叉树5. 对称二叉树6. 二叉树构建与遍历7. 二叉树的层序遍历8. 二叉树的最近公共祖先9. 从前序与中序遍历序列构造二叉树10. 从中序与后序遍历序列构造二叉树11. 根据二叉树创建字符串12. 二叉树的前序遍历非递归实现13…