Java学习笔记43——函数式接口

函数式接口

  • 函数式接口
    • 函数式接口概述
      • 函数式接口作为方法的参数
      • 函数式接口作为方法的返回值
    • 常用的函数式接口
      • Supplier接口
      • Comsumer接口
      • Predicate接口
      • Function接口

函数式接口

函数式接口概述

有且仅有一个抽象方法的接口
是lambda表达式的前提

需要注意的是

  • 默认方法不是抽象方法,因为它们已经实现了。
  • 重写了超类Object类中任意一个public方法的方法并不算接口中的抽象方法。

Java中的函数式编程体现的就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的lambda才能顺利地进行推导

public interface MyInterface{void show();
}
public class MyInterfaceDemo{public static void main(String[] args){MyInterface my=()->System.out.println("函数式接口");my.show();}
}

如何检测一个接口是不是函数式接口?

  • @FunctionalInterface
  • 放在接口定义的上方:如果是函数式接口编译通过,不是则编译失败

注意

  • 自己定义函数式接口的时候,**@FunctionalInterface**是可选的,只要满足函数式接口的条件,不写也是,但是建议加上这个注解。

函数式接口作为方法的参数

需求

  • 定义一个类(RunnableDemo),在类中提供两个方法
    • 一个方法是:startThread(Runnable r) 方法参数Runnable是一个函数式接口
    • 一个方法是主方法,在主方法中调用startThread方法
public class RunnableDemo{public static void main(String[] args){//匿名内部类的方式startThread(new Runnable(){@Overridepublic void run(){System.out.println(Thread.currentThread().getName()+"线程启动了!");}});//Lambda表达式改进startThread(()->System.out.println(Thread.currentThread().getName()+"线程启动了!"));}private static void startThread(Runnable r){//Thread t=new Thread(r);//t.start();new Thread(r).start();}
}

如果方法的参数是一个函数式接口,可以使用Lambda表达式作为参数传递

  • startThread(()->System.out.println(Thread.currentThread().getName()+“线程启动了!”));

函数式接口作为方法的返回值

需求

  • 定义一个类(ComparatorDemo)在类中提供两个方法
    • 一个方法是:Comparator<String>getComparator() 方法的返回值是Comparator是一个函数式接口
    • 一个方法是主方法,在主方法中 调用getComparator方法
public class ComparatorDemo{public static void main(String[] args){//构造使用场景//定义集合存储字符串元素ArrayList<String> array=new ArrayList<String> ();array.add("c");array.add("aaa");array.add("bb");System.out.println("排序前:"+array);Collections.sort(array, getcomparator())  ;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)-> return s1.length()-s2.length();}}
}

如果方法的返回值是一个函数式接口,可以使用lambda表达式作为结果返回

常用的函数式接口

Supplier接口

Supplier:包含一个无参的方法

  • T get():获得结果
  • 该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
  • supplier接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类
    型的数据供我们使用
public class SupplierDemo{public static void main(String[] args){
//		String s=getString(()->{
//			return "伦伦";
//		});String s=getString(()->"伦伦");System.out.println(s);Integer i=getInteger(()->30);System.out.println(i);}//定义一个方法,返回一个字符串数据private static String getString(Supplier<String> sup){return sup.get();}//定义一个方法返回整数数据private static Integer getInteger(Supplier<Integer> sup){return sup.get();}
}

Comsumer接口

Consumer:包含两个方法

  • void accept(T t):对给定的参数执行此操作
  • default Consumer andThen(Consumer after): 返回一个组合的Consumer,依次执行此操作,然后执行after操作
public class ConsumerDemo{public static void main(String[] args){
//		operatorString("伦伦",(String s)->{
//			System.out.println(s);
//		});operatorString("伦伦",s->System.out.println(s));//方法引用改进operatorString("伦伦",System.out::println);operatorString("Y伦伦",(s)->{System.out.println(new StringBuilder(s).reverse().toString());});//优化operatorString("Y伦伦",s->System.out.println(new StringBuilder(s).reverse().toString()));System.out.println("----------");operatorString("Y伦伦",s->System.out.println(s),s->System.out.println(new StringBuilder(s).reverse().toString()));}//定义一个方法消费字符串数据private static void operatorString(String name,Consumer<String> con){con.accept(name);}//定义一个方法,用不同的方式消耗同一个字符串两次private static void operatorString(String name,Consumer<String> con1,Consumer<String> con2){
//		con1.accept(name);
//		coo2.accept(name);//改进con1.andThen(con2).accept(name);}
}

Predicate接口

Predicate:常用的四个方法

  • boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值
  • default Predicatenegate(): 返回一个逻辑的否定,对应逻辑非
  • defaultPredicateand(Predicateother): 返回一个组合判断,对应短路与
  • default Predicate or(Predicate other): 返回一个组合判断,对应短路或
  • Predicate接口通常用于判断参数是否满足指定的条件
public class PredicateDemo01{public static main(String[] args){boolean b1=checkString("Hello",s->return s.length()>8);System.out.println(b1);boolean b2=checkString("HelloWorld",s->return s.length()>8);System.out.println(b2);}private static boolean checkString(String s,Predicate<String> pre){return pre.test(); }
}

Function接口

Function<T,R>:常用的两个方法

  • R apply(T t):将此函数应用于给定的参数
  • default Function andThen(Function after): 返回一个组合数,首先将该函数应用于输入,然后将after函数应用于结果
  • Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值
class FunctionDemo{public static main(String[] args){String s="伦伦,25";covert(s,ss->{ss.split(",")[1]},ss->Integer::parseInt,i->i+100);}private static void covert(String s,Function<String,String> fun1,Function<String ,Integer> fun2,Function<Integer,Integer> fun3){int i=fun1.abdThen(fun2).andThen(fun3).apply(s);System.out.println(i);}
}

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

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

相关文章

选择java商城开发商需要注意哪些方面?

Java商城开发是一项庞大而复杂的任务&#xff0c;选择一家合适的开发商至关重要。那么&#xff0c;我们在选择Java商城开发商时&#xff0c;需要注意哪些方面呢&#xff1f; 1、专业经验 选择具有丰富经验的开发商是至关重要的。开发商应该拥有多年的Java开发经验&#xff0c;…

代码随想录算法训练营第13天|● 239. 滑动窗口最大值 ● 347.前 K 个高频元素 ● 总结

239. 滑动窗口最大值 困难 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,…

【MATLAB源码-第82期】基于matlab的OFDM系统载波频移偏差(CFO)估计,对比三种不同的方法。

操作环境&#xff1a; MATLAB 2013b 1、算法描述 正交频分复用&#xff08;OFDM&#xff09;系统中的载波频率偏移&#xff08;CFO&#xff09;估计是一项关键技术&#xff0c;用于确保数据传输的准确性和效率。CFO通常由于振荡器频率不匹配和多普勒频移引起。不同的CFO估计…

DP1332E/DP1363F国产多协议NFC读写器芯片支持ISO15693/ISO18092

目录 ISO/IEC 15693与ISO/IEC 18092协议标准差异DP1363F与DP1332E对比共同点主要差异点 ISO/IEC 15693与ISO/IEC 18092协议标准差异 ISO/IEC 15693是用于近距离无线通信中的射频识别&#xff08;RFID&#xff09;技术的标准协议&#xff0c;它定义了与读写器之间的通信协议。这…

LeetCode热题100——图论

图论 1. 岛屿的数量2. 腐烂的橘子 1. 岛屿的数量 给你一个由 ‘1’&#xff08;陆地&#xff09;和 ‘0’&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆…

鸿蒙为什么使用typescript 作为开发语言 而不是 flutter 或者 kotlin

猜想如下 dev studio 是基于 idea 二次开发的 &#xff0c;使用kotlin 应该是更合理 变成 jetbrain 全家桶&#xff0c; 但是 现在android 开发也是kotlin 是不是为了做分割 &#xff0c;所以不使用kotlin flutter 是谷歌的 安卓也是谷歌的 所以不采用 typescript 是微软的…

力扣:168. Excel表列名称(Python3)

题目&#xff1a; 给你一个整数 columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&…

达梦数据库如何查看索引和表的DDL

1&#xff09;查看索引DDL&#xff0c;先查看索引的objectID,再查询该objectid的DDL SQL> select * from dba_objects where object_nameIDX_INTERFACE_DATA_SYNC_FLAG; LINEID OWNER OBJECT_NAME SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_T…

微信、支付宝、携程等多款app任意文件读取漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、漏洞描述 微信、支付宝、小米浏览器、携程应用等国内主流软件均存…

C编译环境和预处理(非常详细,建议收藏)

C编译环境和预处理&#xff08;非常详细&#xff0c;建议收藏&#xff09; 一、程序的翻译环境和执行环境二、 详解编译链接2.1 翻译环境2.2 编译本身的几个阶段符号汇总、符号表、合并段表、符号表的合并和重定位分别是什么&#xff1f; 2.2 运行环境 三、预处理详解3.1 预定义…

斐波那契数列,剑指offer,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff08;动态规划&#xff09;&#xff1a; 代码实现&#xff1a; 补充说明&#xff1a; 代码&#xff08;优化&#xff09;&…

栈和队列

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 2.2队列的实现 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈…

概念解析 | 网络安全数字孪生(Digital Twin of Cyber Security, DTCS)技术

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:网络安全数字孪生。 概念解析 | 网络安全的“数字镜像” —— 网络安全数字孪生 1. 背景介绍 随着数字化转型进程的深入推进,网络空间安全问题日益凸显。当前的网络安全防护面…

使用Dockerfile构建hexo博客镜像,并部署

基于centos7.9父镜像构建hexo:1.0镜像&#xff1a; cat << eof > Dockerfile # 根镜像 FROM centos:7.9.2009 MAINTAINER qv123<qv1095322098163.com> # 设置工作目录 WORKDIR /usr/src/app # 暴露端口号 EXPOSE 4000 # 作者注释 MAINTAINER qv123<qv1095322…

关于响应式编程ReactiveX,RxGo

ReactiveX&#xff0c;简称为 Rx&#xff0c;是一个异步编程的 API。与 callback&#xff08;回调&#xff09;、promise&#xff08;JS 提供这种方式&#xff09;和 deferred&#xff08;Python 的 twisted 网络编程库就是使用这种方式&#xff09;这些异步编程方式有所不同&a…

C语言实现冒泡排序(超详细)

排序算法 - 冒泡排序 什么是冒泡排序&#xff1f;冒泡排序有啥用呢&#xff1f;冒泡排序的实现代码讲解冒泡排序的总结 什么是冒泡排序&#xff1f; 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的列表&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序…

Springboot框架中使用 Redis + Lua 脚本进行限流功能

Springboot框架中使用 Redis Lua 脚本进行限流功能 限流是一种用于控制系统资源利用率或确保服务质量的策略。在Web应用中&#xff0c;限流通常用于控制接口请求的频率&#xff0c;防止过多的请求导致系统负载过大或者防止恶意攻击。 什么是限流&#xff1f; 限流是一种通过…

MySql操作

Mysql数据库项目学习笔记 1.条件查询后排序 (SELECT counter : 0) temp设定临时变量ORDER BY id ASC用于将id以升序形式进行排列 SELECTcounter : counter 1 AS ROW,username,type,content FROMtest_info,( SELECTcounter : 0 ) temp WHEREusername 2 AND type 3 ORDER BYi…

获取商品详情信息API接口:1688开放平台功能解析

随着互联网技术的发展&#xff0c;电商平台已经成为人们购物的主要渠道。在这个背景下&#xff0c;1688开放平台提供了丰富的API接口&#xff0c;帮助开发者更好地与平台交互&#xff0c;获取所需数据。本文将重点关注如何获取商品详情信息的API接口。 一、接口概述 通过1688…

项目交互-选择器交互

选择器交互 <div><el-select v-model"valueOne" placeholder"年级"><el-option v-for"item in optionsOne" :key"item.gradeId" :label"item.gradeName" :value"item.gradeId"></el-option&…