函数式接口

文章目录

  • 函数式接口
    • 函数式接口当做方法的参数
    • 函数式接口作为返回值
    • 生产者接口 - 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,一经查实,立即删除!

相关文章

多旋翼无人机调试问题分析

一、电机和螺旋桨检查 在多旋翼无人机的调试过程中&#xff0c;首先需要检查电机和螺旋桨的状态。电机应转动灵活&#xff0c;无卡滞现象&#xff0c;且无明显磨损。螺旋桨应安装牢固&#xff0c;无松动现象&#xff0c;且桨叶完好无损。若发现问题&#xff0c;应及时更换或维…

(菜鸟自学)漏洞利用——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作为…

【Ubuntu】systemctl 命令

systemctl 是一个用于检视和控制 systemd 系统和服务管理器的命令行工具。systemd 是用于启动、停止和管理 Linux 系统中的服务的守护进程。以下是一些常用的 systemctl 命令及其说明&#xff1a; systemctl start <unit>: 启动指定的服务单元 systemctl start sshd sy…

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

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

Java入门篇:打造你的Java开发环境——从零开始配置IDEA与Eclipse

引言 “工欲善其事&#xff0c;必先利其器” 作为每一位Java初学者的必经之路&#xff0c;搭建合适的开发环境是至关重要的第一步。本篇将详细指导你如何安装并配置两大主流Java开发工具——IntelliJ IDEA和Eclipse&#xff0c;助你在编程之旅上迈出坚实的第一步。 一、Java开发…

微信小程序分页加载功能,结合后端实现上拉底部加载下一页数据,数据加载中和暂无数据提示

&#x1f935; 作者&#xff1a;coderYYY &#x1f9d1; 个人简介&#xff1a;前端程序媛&#xff0c;目前主攻web前端&#xff0c;后端辅助&#xff0c;其他技术知识也会偶尔分享&#x1f340;欢迎和我一起交流&#xff01;&#x1f680;&#xff08;评论和私信一般会回&#…

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

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

深入理解Flutter中的GlobalKey与LocalKey(ValueKey、ObjectKey、UniqueKey)及其使用方法

在Flutter中&#xff0c;Key是一个非常重要的概念&#xff0c;它用于标识和管理Widget。GlobalKey和LocalKey是Key的两个主要子类&#xff0c;而ValueKey、ObjectKey和UniqueKey则是LocalKey的具体实现。在本文中&#xff0c;我们将深入介绍这些关键概念以及它们在Flutter中的使…

XR虚拟拍摄技术:开启短剧与微剧的全新篇章

随着科技的快速发展&#xff0c;XR虚拟拍摄技术已经成为短剧与微剧制作的重要工具。这种技术为影视制作带来了巨大的变革&#xff0c;为观众带来了更加丰富、逼真的视听体验。 XR虚拟拍摄技术通过构建虚拟场景&#xff0c;使得制作人员能够更加自由地发挥创意和想象力。这种技术…

android:excludeFromRecents

android:excludeFromRecents 基础从根上影响 TaskexcludeFromRecents 属性可能会影响系统 基础 android:excludeFromRecents是一种在Android应用程序清单文件&#xff08;AndroidManifest.xml&#xff09;中使用的属性&#xff0c;用于指定一个Activity是否应该在最近任务列表…

两数之和[中等]

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

MySQL修炼手册17:高级查询优化:深入理解执行计划

目录 写在开头1 执行计划的基本概念1.1 SQL查询解析1.1.1 语法分析1.1.2 语义分析1.1.3 内部数据结构的生成1.2 优化执行计划1.2.1 统计信息的利用1.2.2 索引选择1.2.3 连接算法1.2.4 子查询优化1.3 执行计划的评估1.3.1 统计信息的利用1.3.2 索引选择1.3.3 连接算法1.3.4 子查…

关于视觉3d目标检测学习像素深度的一点理解

在真实世界的一个物体&#xff0c;可以通过相机矩阵将其投影到像素坐标系上 但是&#xff0c;在像素坐标系上的像素&#xff0c;由于相机的原理&#xff0c;导致它的深度信息已经没有了&#xff0c;所以原理上是没法得到其真实深度的(即3d位置) 那么现在的深度学习方法又为什…

【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 字符…