当前位置: 首页 > news >正文

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 函数式接口概述 函数式接口&#xff1a;有且仅有一个抽象方法的接口 Java中的函数式编程体现就是Lambda表达式&#xff0c;所以函数式接口就是可以适用于Lambda使用的接口只有确保接口中有且仅有一个抽象方法&#xff0c; 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 &#xff08;若证书过期yum install -y ca-certificates) 解压源码 tar -zxvf…...

vue 截取字符串的方法

vue中的字符串方法&#xff0c;我目前使用最多的是下面两种方法&#xff0c;因为 vue的字符串方法支持断言操作。 1、 vue中截取字符串的方法如下&#xff1a; 2、 vue中截取字符串的方法&#xff0c;这个方法也是需要依赖于 vue库提供的支持。 3、 vue中截取字符串的方法&…...

可数集和不可数集

有限集和无限集 后继集 设 S S S是任一集合&#xff0c;称 S S ∪ { S } S^ S\cup \left\{ S\right\} SS∪{S}为 S S S的后继集 自然数集 自然数集 N \mathbb{N} N的归纳定义是&#xff1a; &#xff08;1&#xff09; ∅ ∈ N \empty \in \mathbb{N} ∅∈N &#xff08…...

<Linux>《Linux 之 ps 命令详解大全(含实用命令)》

《Linux 之 ps 命令详解大全&#xff08;含实用命令&#xff09;》 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 配置管理中&#xff0c;extension-configs 和 shared-configs 分别是两种不同类型的配置&#xff0c;它们的主要区别在于它们的使用场景和作用。 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 目的&#xff1a; a. 计算预测值与真实值之间的差距; b. 可通过此条件&#xff0c;进行反向传播。 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、拉取镜像最新版本&#xff0c;如果写 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等功能

彭博社的马克・古尔曼&#xff08;Mark Gurman&#xff09;在最新一期 Power On 时事通讯中表示&#xff0c;苹果即将推出的 iOS 17 系统将改进 Wallet、Find My、SharePlay 和 AirPlay 等多项功能。 古尔曼在博文中还表示苹果会增强 Find My 的位置服务&#xff0c;同样也没…...

什么是webSocket?

什么是webSocket WebSockets是一种协议&#xff0c;它允许在Web应用程序中建立持久连接。这意味着当客户端与服务器建立连接后&#xff0c;它们可以始终保持连接状态&#xff0c;直到其中一个终止连接。相比于传统的HTTP协议&#xff0c;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) 故障检测功能、米勒钳位功能、漏极开路故障反馈、软关断功能以及可选择的自恢复模式&#xff0c;兼容光耦隔离驱动器。 SLMi331的DESAT阈值为6.5V&#xff0c;其最大驱动电…...

【嵌入式Linux基础】启动初始化程序--init程序

文章目录 内核启动后初始化程序简介BusyBox initBuildroot init 脚本 后记 内核启动后 内核引导代码在initramfs中通过内核命令行中的root指定的文件系统中去寻找根系统文件&#xff0c;并执行一个相应的程序。在默认情况下&#xff0c;对于initramfs这个程序是/init&#xff0…...

基于Java实现农产品交易平台的设计与实现_kaic

【摘要】农业是我国国民经济的重要组成部分&#xff0c;随着信息化的普及&#xff0c;4G网络、光纤以及5G网络也日益完善&#xff0c;农业信息化的发展成为了必然。同时&#xff0c;由于本年疫情原因&#xff0c;导致农作物积压销售&#xff0c;甚至腐烂造成不必要的浪费&#…...

视频转换、视频压缩、录屏等工具合集:迅捷视频工具箱

这是一款功能强大的视频处理软件&#xff0c;提供了多种视频处理功能。可以使用该软件进行视频剪辑、视频转换、音频转换、视频录像、视频压缩、字幕贴图等多种操作。软件界面简洁易用&#xff0c;操作方便&#xff0c;可以满足各种视频处理需求。 基本功能 视频压缩&#xff…...

理解时序数据库的时间线

在当今数据爆炸的时代&#xff0c;时序数据已经成为企业和组织中不可或缺的一部分。它们包括了从传感器、监控设备、日志记录系统和金融交易等多种来源的大量数据&#xff0c;这些数据按照时间顺序排列&#xff0c;记录了各种事件和活动的发生和变化。时序数据的分析和处理对于…...

音视频技术开发周刊 | 295

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 微软炸通Windows与ChatGPT全家桶&#xff01;人手一个Copilot&#xff0c;AI宇宙降临 三位OpenAI掌舵人亲自撰文&#xff1a;我们应该如何治理超级智能&#xff1f; OpenA…...

15稳压二级管

目录 一、基本原理 二、I-V特性 三、工作原理 四、参数 1、Vz 2、Zzt和Zzk 3、IrVr 4、VfIf 5、Pd 五、应用 1、示例1 2、串联应用 3、钳位电路 六、动态电阻 一、基本原理 稳压二极管或“击穿二极管”(有时也称为齐纳二极管)基本上与标准PN结二极管相同&#xf…...

一些零零碎碎的记录

Questions1. 用户访问多网址服务器同一个IP是怎么回事 Q:用户访问服务器的同一个IP不同网址&#xff0c;服务器是如何区分的A: 在 HTTP 协议中&#xff0c;客户端通过发送请求报文来向服务器请求资源。每个 HTTP 请求都包含一个 HTTP 头部&#xff0c;其中包括了一些关键信息&…...

MyBatis - Spring Boot 集成 MyBatis

文章目录 1.版本要求2.导入依赖3.自动配置2.可配置项 MyBatis-Spring-Boot-Starter 可以帮助你更快地在 Spring Boot 之上构建 MyBatis 应用。通过使用该模块我们能够快速实现以下目的&#xff1a; 构建单体应用程序将几乎不需要样板配置使用更少的 XML 配置 1.版本要求 MyB…...

常见开源协议介绍

开源协议是指开放源代码软件的使用、修改和分发的规则。开源协议的出现&#xff0c;使得开发者可以在保护自己的知识产权的同时&#xff0c;也可以让其他人使用、修改和分发自己的代码。本文将介绍几种常见的开源协议。 一、GPL协议 GPL&#xff08;GNU General Public Licens…...

第十九章行为型模式—中介者模式

文章目录 中介者模式解决的问题结构实例存在的问题适用场景 中介者模式和代理模式的区别代理模式中介模式桥接模式总结 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法…...

AKStream部署1:ZLMediaKit流媒体服务器(win)

环境准备&#xff1a; windows10/11 visual stadio 2022(.net 6) cmake 3.22.0 git bash 没讲究直接下最新的 ffmpeg &#xff1a; ffmpeg-5.1.2-full_build VLC播放器&#xff1a;VLC media player ZLMediaKit&#xff1a;gitee地址 1、安装上述软件 例ffmpeg下载解压至某自定…...

【Redis】Redis 中地理位置功能 Geospatial 了解一下?

文章目录 前言一、Geospatial Indexes 的数据结构二、常用命令三、实用场景示例1. 找出某一经纬度周围的餐馆2. 按照距离排序查询景点 四、在实际开发中&#xff0c;需要注意以下几点&#xff1a; 前言 Geospatial Indexes 是 Redis 提供的一种数据结构&#xff0c;用于存储和…...

Qt Qml 实现键鼠长时间未操作锁屏

文章目录 摘要实现思路键盘鼠标监控百度到的方法我的自己方法 最后 关键字&#xff1a; Qt、 Qml、 QInputEvent 、 QStandardItem、 eventFilter 摘要 今日需求&#xff1a; 项目中需要实时检测用户是否长时间为操作键盘和鼠标&#xff0c;如果超过预设时间未操作键盘和…...

常用的数字高程模型(DEM)数据介绍,附免费下载

常用的数字高程模型&#xff08;DEM&#xff09;数据&#xff1a;​ ETOPO&#xff08;1.8千米&#xff09; ETOPO是一种地形高程数据&#xff0c;由NGDC美国地球物理中心发布&#xff0c;与大多数高程数据不同的是&#xff0c;它还包含海底地形数据。 SRTM15&#xff08;450…...

字节跳动面试挂在2面,复盘后,决定二战.....

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…...