一、Lamdba 表达式与函数式接口(最终版)

一、Lamdba 表达式与函数式接口

1.1 Lamdba 表达式与函数式接口

1.1.1 Lambda 表达式概述

  • Lambda 表达式是 Java 8 引入的一个新特性
  • Lambda 表达式可以被视为匿名函数
  • 允许在需要函数的地方以更简洁的方法定义功能
  • Lambda 表达式可以完成简洁的函数定义
  • Stream API 中大量使用了 Lambda 表达式,可以使用 Lambda 表达式对集合进行操作
  • Lambda 表达式允许你将函数作为参数传递传递给其它函数,或将函数组合在一起形成新的函数

1.1.2 使用 Lambda 表达式实现接口

  • 首先定义一个接口
interface MyInterface {int sum(int x,int y);
}
public class Main {public static void main(String[] args) {}
}
  • 使用 Lambda 表达式实现接口
interface MyInterface {int sum(int x,int y);
}
public class Main {public static void main(String[] args) {MyInterface myInterface = (int x,int y) ->{return x+y;};System.out.println(myInterface.sum(1, 2));}
}

1.1.3 函数式接口概述

  • 接口中只有一个未实现的方法,被称为函数式接口
  • 只要是函数式接口,就可以使用 Lambda 表达式
  • 在 Java 中可以使用 @FunctionalInterface 来表示函数式接口

1.1.4 Lambda 表达式简写形式

1、参数类型可以不写,只写参数名

 MyInterface myInterface = (x,y) ->{return x+y;};

2、参数变量名也可以随意定义,但是参数数量一定要一致

 MyInterface myInterface = (i,j) ->{return x+y;};

3、如果只有一个参数,可以不写小括号,但没有参数一定要写小括号

 MyInterface myInterface1 = i ->{return i;
};MyInterface myInterface2 = () ->{return 1;
};

4、方法体如果只有一句话,可以省略 {}

 MyInterface myInterface = i -> return i;

1.2 Function PAI 函数式接口

1.2.1 Function 函数式接口概述

  • Function API 是 Java 函数式接口的底层定义
  • Function API 包括了许多不同种类类型的函数式接口
  • 以支持各种函数式编程风格和操作

1.2.2 Function API 不同类型的函数式接口

以下是 Function API 内置的函数式接口

image-20240123200328203

  • 其中标红的四个接口 Consumer、Function、Perdicate、Supplier 是四个常见的函数式接口
  • 它们四个代表了函数式编程中的不同类型
    • Consumer 接口 表示接受一个参数并无返回值操作,被称为消费者
    • Function 接口 表示接受一个参数并返回一个结果的函数,通常被视为常用的函数接口
    • Perdicate 接口表示接受一个参数并返回一个布尔值,被称为断言
    • Supplier 接口表示无参数并返回一个结果,并成为提供者

1.2.3 使用 Function 不同类型的接口完成小案例

小案例

1.使用 Supplier 生成一个字符串数据

2.使用 Predicate 验证输入字符串是否为数字

3.使用 Function 转换数据,将字符串转为数字

4.使用 Consumer 判断数字是奇数还是偶数

5.将上面一系列操作串联起来

每个函数式接口当中都有一个方法,需要调用,如果不清楚方法名,可找到这个接口自行查看

1、使用 Supplier 生成一个字符串数据

package org.example;import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//生成一个字符串数据Supplier<String> supplier=() -> "42";System.out.println(supplier.get());}
}

2、使用 Predicate 验证输入字符串是否为数字

package org.example;import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//验证输入字符串是否为数字Predicate<String> predicate=str -> str.matches("-?\\d+(\\.\\d+)?");System.out.println(predicate.test("435"));System.out.println(predicate.test("435a"));}
}

3、转换数据,将字符串转为数字

package org.example;import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//转换数据,将字符串转为数字Function<String,Integer> function= Integer::parseInt;Integer num = function.apply("435");System.out.println(num);}
}

4、判断数字是奇数还是偶数

package org.example;import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//判断数字是奇数还是偶数Consumer<Integer> consumer=integer -> {if (integer %2 == 0){System.out.println("偶数"+integer);}else {System.out.println("奇数"+integer);}};consumer.accept(44);}
}

5、将这些操作串联起来,实现判断 Supplier 生成的字符串是奇数还是偶数

package org.example;import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionDemo {public static void main(String[] args) {//生成一个字符串数据Supplier<String> supplier=() -> "42";//验证输入字符串是否为数字Predicate<String> predicate=str -> str.matches("-?\\d+(\\.\\d+)?");//转换数据,将字符串转为数字Function<String,Integer> function= Integer::parseInt;//判断数字是奇数还是偶数Consumer<Integer> consumer=integer -> {if (integer %2 == 0){System.out.println("偶数"+integer);}else {System.out.println("奇数"+integer);}};//将这些操作串联起来,实现判断 Supplier  生成的字符串是奇数还是偶数if(predicate.test(supplier.get())){consumer.accept(function.apply(supplier.get()));}else {System.out.println("非法数字");}}
}

6、也可以将他们全部组合成一个方法

package org.example;import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;public class FunctionMethod {public static void main(String[] args) {myMethod(() -> "4aaa",str -> str.matches("-?\\d+(\\.\\d+)?"),Integer::parseInt,integer -> {if (integer %2 == 0){System.out.println("偶数"+integer);}else {System.out.println("奇数"+integer);}});}private static void myMethod(Supplier<String> supplier,Predicate<String> predicate,Function<String,Integer> function,Consumer<Integer> consumer){if(predicate.test(supplier.get())){consumer.accept(function.apply(supplier.get()));}else {System.out.println("非法数字");}}
}

1.3 Stream API

1.3.1 Stream API 概述

  • Stream API 主要用于处理集合数据的流式操作
  • Stream API 提供了一些列的操作方法,如过滤、排序、映射、聚合等
  • Stream API 可以从各种数据源创建流,如集合、数组、文件等
  • 它的内部采用了并行处理机制,在处理大数据集时具有较高的性能优势

1.3.2 Stream 流的简介

  • Stream被翻译为流,它的工作过程像将一瓶水导入有很多过滤阀的管道一样,水每经过一个过滤阀,便被操作一次,比如过滤,转换等,最后管道的另外一头有一个容器负责接收剩下的水。

  • 就类似于将数据导入一个管道,一遍遍的过滤,最后形成一个最终需要的数据,然后接收结果

  • 将数据导入一个过滤的导管中被称为创建流

  • 将数据一遍遍的过滤,被称为中间操作,我们可以定义很多种中间操作

  • 数据过滤成想要的结果时,需要进行 终止操作

  • 然后最后再接收结果

  • 这些操作就称之为流式操作

  • 而流的三大部分主要分为

    • 创建数据流
    • N 个中间操作
    • 1 个终止操作
  • 因为流式操作是可以并发的,所以所有并发流的操作都是无状态数据

    • 数据状态只在函数内有效
    • 不溢出至函数外

1.3.3 Stream API 的基本使用

以下是一个 Stream API 的小案例,用于筛选出集合中的偶数

然后将偶数转为字符串,遍历出来进行输出

package org.example;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class StreamAPI {public static void main(String[] args) {// 创建一个整数列表List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);// 使用 Stream API 进行操作numbers.stream()// 筛选偶数.filter(number -> number % 2 == 0)// 排序.sorted()// 映射为字符串.map(String::valueOf)// 收集结果.collect(Collectors.toList()).forEach(System.out::println);}
}
  • **通过 numbers.stream() 方法将列表转换为 Stream,这个步骤为创建数据流 **

  • 使用 filter() 方法筛选出偶数,为中间操作

  • 使用 sorted() 方法对筛选后的结果进行排序,为中间操作

  • 使用 mapToObj() 方法将流中的整数映射为字符串,为中间操作

  • 使用 collect(Collectors.toList()) 方法将映射后的结果收集到一个新的列表中,为中间操作

  • 最后,使用 forEach() 方法遍历并打印收集后的结果,为终止操作

  • 判断是否是中间操作,还是终止操作

    • 可以直接点开类查看注释
    • 中间操作一般都有返回值
    • 终止操作一般是没有返回值的,也可以快速判断
  • **通过 numbers.stream() 方法将列表转换为 Stream,这个步骤为创建数据流 **

  • 使用 filter() 方法筛选出偶数,为中间操作

  • 使用 sorted() 方法对筛选后的结果进行排序,为中间操作

  • 使用 mapToObj() 方法将流中的整数映射为字符串,为中间操作

  • 使用 collect(Collectors.toList()) 方法将映射后的结果收集到一个新的列表中,为中间操作

  • 最后,使用 forEach() 方法遍历并打印收集后的结果,为终止操作

  • 判断是否是中间操作,还是终止操作

    • 可以直接点开类查看注释
    • 中间操作一般都有返回值
    • 终止操作一般是没有返回值的,也可以快速判断

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

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

相关文章

银行数据仓库体系实践(7)--数据模型设计及流程

数据仓库作为全行或全公司的数据中心和总线&#xff0c;汇集了全行各系统以及外部数据&#xff0c;通过良好的系统架构可以保证系统稳定性和处理高效性&#xff0c;那如何保障系统数据的完备性、规范性和统一性呢&#xff1f;这里就需要有良好的数据分区和数据模型&#xff0c;…

【Vue实用功能】Vue实现文档在线预览功能,在线预览PDF、Word等office文件

1、Office Web(微软的开发接口) 优点 没有 Office也可以直接查看Office 文件适用于移动端、PC无需下载文件就可以在浏览器中查看 <iframe src"文档地址" frameborder"0" /> const docUrl 外网可预览的地址 const url encodeURIComponent(docUrl…

C#用DateAndTime.DateDiff方法和TimeSpan分别计算时间间隔

目录 一、计算时间间隔的方法 1.用DateAndTime.DateDiff方法计算时间间隔 2.使用TimeSpan获取日期时间间隔 二、实例 1.示例一&#xff1a;用DateAndTime.DateDiff方法计算时间间隔 2.示例二&#xff1a;使用TimeSpan获取日期时间间隔 一、计算时间间隔的方法 1.用Date…

element el-date-picker type=“datetimerange“

刚写完结果需求变更了。封装的时间组件重新做。结合eacharts 。 直接上代码了 日期选择组件封装 <template><section class"warning-container"><header class"query-head"><el-form :inline"true" class"query-form…

运费业务:

新增或修改&#xff1a; 第一步&#xff1a;查询是否有存在的模板&#xff0c;没有的话直接新增 第二步&#xff1a;模板不为空(存在经济区互寄情况)&#xff0c;判断经济区中的关联城市是否已经添加&#xff08;一条SQL数据中经济区中的关联城市可以选择多个,但其他经济区中也…

JavaSE基础学习

一、编程入门 二、Java语言概述 三、Java基本语法 四、程序流程控制 五、数组 六、面向对象(上) 数组工具类的封装: 七、面向对象(中) 八、面向对象(下) 九、异常处理 十、多线程 十一、常用类 十二、枚举类与注解 十三、集合 十四、泛型 十五、IO流 十六、网络编程 十七、反射…

【VSAN数据恢复】VSAN数据重构迁移失败的数据恢复案例

VSAN简介&#xff1a; VSAN存储是一个对象存储&#xff0c;以文件系统呈现给在vSphere主机上。这个对象存储服务会从VSAN集群中的每台主机上加载卷&#xff0c;将卷展现为单一的、在所有节点上都可见的分布式共享数据存储。 对于虚拟机来说&#xff0c;只有一个数据存储&#x…

Docker容器基本管理

目录 一、概述 &#xff08;一&#xff09;为什么要用到容器 &#xff08;二&#xff09;docker概念 1.镜像 2.容器 3.仓库 &#xff08;三&#xff09;Docker与虚拟机的区别 &#xff08;四&#xff09;Linux namespace的六大类型 二、安装docker容器引擎 &#xff…

区块链技术在教育领域的应用:Web3教育变革

随着Web3时代的来临&#xff0c;区块链技术在各个领域都展现出了巨大的潜力&#xff0c;而在教育领域&#xff0c;区块链的应用正引领着一场教育变革。本文将深入探讨区块链技术在教育领域的创新应用&#xff0c;以及这一应用如何推动Web3时代的教育变革。 1. 学历和成绩的去中…

成本更低、更可控,云原生可观测新计费模式正式上线

云布道师 在上云开始使用云产品过程中&#xff0c;企业一定遇见过两件“讨厌”事&#xff1a; 难以理解的复杂计费逻辑&#xff0c;时常冒出“这也能收费”的感叹&#xff1b; 某个配置参数调节之后&#xff0c;云产品使用成本不可预估的暴涨。 可观测作为企业 IT 运维必须品…

第13次修改了可删除可持久保存的前端html备忘录:删除按钮靠右,做了一个背景主题:现代深色

第13次修改了可删除可持久保存的前端html备忘录&#xff1a;删除按钮靠右&#xff0c;做了一个背景主题&#xff1a;现代深色 备忘录代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"vi…

Go语言指针变量

1. 指针变量 区别于C/C中的指针&#xff0c;Go语言中的指针不能进行偏移和运算&#xff0c;是安全指针。 Go语言中的指针3个概念&#xff1a;指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝&#xff0c;当我们想要修改某个变量的时候&a…

【数据结构】72变的双端队列

双端队列 前言一、双端队列1.1 双端队列的定义1.2 输入受限的双端队列1.3 输出受限的双端队列1.5 输入输出都受限的双端队列1.6 小结 二、双端队列的使用2.1 双端队列的出队序列——暴力求解2.1.1 栈的出栈序列2.1.2 输入受限的双端队列2.1.3 输出受限的双端队列2.1.4 输入输出…

three.js中Meshline库的使用

three.js中Meshline的使用 库的地址为什么要使用MeshLine,three.js内置的线不好用吗?MeshLine入门MeshLine的深入思考样条曲线一个问题 库的地址 https://github.com/spite/THREE.MeshLine?tabreadme-ov-file 为什么要使用MeshLine,three.js内置的线不好用吗? 确实不好用,…

金融帝国实验室(Capitalism Lab)V10版本推出新招高管待命选项

金融帝国实验室&#xff08;Capitalism Lab&#xff09;V10版本推出新招高管待命选项 ————————————— 【全新V10版本开发播报】 即将发布的V10版本&#xff0c;在“分配管理器”菜单上将引入一个名为“暂时待命”的新功能。启用此选项后&#xff0c;分配给公司的高…

256:vue+openlayers利用高德逆地理编码,点击地图,弹出某点坐标和地址信息

第256个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中利用高德逆地理编码,点击地图,弹出某点坐标和地址信息。这里要仔细阅读高德地图的逆编码API,同时要注意的是,这种转换在中国很好用,到了欧美国家就不好使了。 直接复制下面的 vue+openlayers源代码…

用队列实现实现栈

用队列实现实现栈 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/implement-st…

HTML+CSS:炫酷按钮组件

效果演示 实现了一个带有发光效果的按钮。按钮在悬停或激活时会产生发光效果&#xff0c;并且按钮上的文字也会随之移动。 Code <main id"app"><button><span class"text">若冰说CSS</span><span class"shimmer">…

Sentinel-1 扩展时序注释数据集 (ETAD)的查询和下载

概述 Sentinel-1的扩展计时注释数据集&#xff08;ETAD&#xff09;是ESA&#xff08;DLR作为承包商&#xff09;开发的新辅助产品&#xff0c;为用户提供校正&#xff0c;将Sentinel-1 SLC图像的几何精度提高到厘米级别。该产品包含分析就绪层&#xff0c;用于消除大气路径延…

用大模型训练实体机器人,谷歌推出机器人代理模型

谷歌DeepMind的研究人员推出了一款&#xff0c;通过视觉语言模型进行场景理解&#xff0c;并使用大语言模型来发出指令控制实体机器人的模型——AutoRT AutoRT可有效地推理自主权和安全性&#xff0c;并扩大实体机器人学习的数据收集规模。在实验中&#xff0c;AutoRT指导超过…