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

java8实战 lambda表达式和函数式接口(上)

前言:

本博客对java8实战第三章的总结,也是上一篇博客行为化参数的延续,介绍一下函数式接口

Lambda表达式

 lambda的表达式的结构由:参数,箭头,主体构成。

lambda示例

函数式接口:

先看上一篇博文最后一个例子如下:,用lambda例子来筛选苹果,其中仓库inventory包含了很多苹果Apple对象list,然后再根据red条件筛选红色苹果,我们对筛选的这个行为进行行为参数化,其中Predicate<T> p,这个就是一个函数式接口。

public interface Predicate<T> {boolean test(T t);
}public static <T> List<T> filter(<List<T> list, Predicate<T> p){List<T> result = new ArrayList<>();for(T e: list){if(p.test(e)){result.add(e);}        }
}List<Apple> redAndHeavyApple = filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));

什么是函数式接口?简单来说,就是定义一个抽象方法的接口,如上面Predicate接口里面定义了一个抽象方法test,它就是函数式接口,就是这么简单。

那么函数式接口可以用来做什么?Lambda表示式允许你直接以内联形形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。简单来说,Lambda就是一个函数式接口的具体实现,而lambda主体部分就是函数式接口的抽象方法。

它的效果类似这样,以“等号”分割线的上下两部分一样的效果,而可以看到lambda表达式更简洁。

List<Apple> redAndHeavyApple = filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));
===============================================
public class AppleRedPredicate implements Predicate {public boolean test(Apple apple) {return "red".equals(apple.getColor();}
}List<Apple> redAndHeavyApple = filterApples(inventory, new AppleRedAndHeavyPredicate());

Java API也有其他的函数式接口:

public interface Comparator<T> {int compare(T o1, To2);
}public interface Runnable {void run();
}public interface ActionListener extends EventListener{void actionPerformed(ActionEvent e);
}public interface Callable<V>{V call();
}public interface PrivilegedAction<V>{T run();
}

当前前面那个Predicate<T>接口也是.

如何使用lambda和函数式接口

书本举了一个"环绕执行模式"例子,环绕执行模式,在我看来就是,所有行为都是围绕执行处理过程,比如资源处理时候,打开一个资源(数据库或者文件),然后做一些处理,然后关闭操作,这过程中,中间这段处理过程就是重点。

如下,有一段代码式打开某个文件,并且读取一行并返回

public static String processFile() throws IOException{try (BufferdReader br = new BufferdReader(new FileReader("data.txt"))){return br.readLine();}
}

这段代码式有局限的,就如第一篇博客所说,需求式不断变化的,如果需求改为读取两行,或者返回使用最频繁的词,那上面代码无法满足,那么一种就是不断创建新函数,每种函数处理不同情况,还有一种保持一个处理函数,但是处理函数的入参是行为参数,处理函数统一处理不同行为参数,也就是说处理的行为,体现在参数上,如使用lambda表达式来体现行为参数:

String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());

那么对应的,processFile入参就是函数式接口,所以还需要创建一个能匹配BufferReader->String的函数式接口:

@FunctionalInterface
public interface BufferedReaderProcessor {String process(BufferedReader b) throws IOException;
}

然后processFile就变成了

public static String processFile(BufferedReaderProcessor p) throws IOException{try (BufferdReader br = new BufferdReader(new FileReader("data.txt"))){return p.process(br);}
}

因此我们就得到一个很灵活的processFile,通过用lambda表达式来表达不同的行为:

读取一行:

String result = processFile((BufferedReader br) -> br.readLine());

读取两行: 

String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());

第三章剩下的部分下一篇博客继续讲。我个人感觉这种方式很灵活,我认为它也不是完全完美,其一就是要求行为参数代码量得少,个人感觉不适宜lambda写太多行为代码,我认为如果行为太过复杂反而用不同类来实现函数式接口,将入参变为不同类对象,反而代码可读性更好些。

参考文献:

 《java8 实战》

相关文章:

java8实战 lambda表达式和函数式接口(上)

前言&#xff1a; 本博客对java8实战第三章的总结&#xff0c;也是上一篇博客行为化参数的延续&#xff0c;介绍一下函数式接口 Lambda表达式 lambda的表达式的结构由&#xff1a;参数&#xff0c;箭头&#xff0c;主体构成。 lambda示例 函数式接口&#xff1a; 先看上一篇…...

深度学习中的13种概率分布

1 概率分布概述 共轭意味着它有共轭分布的关系。 在贝叶斯概率论中&#xff0c;如果后验分布 p&#xff08;θx&#xff09;与先验概率分布 p&#xff08;θ&#xff09;在同一概率分布族中&#xff0c;则先验和后验称为共轭分布&#xff0c;先验称为似然函数的共轭先验。 多…...

C#基础知识 - 操作数与运算符篇2

C#基础知识 - 操作数与运算符篇 4.2 运算符4.2.1 按操作数个数分类4.2.2 按运算类型分类4.2.3 对运算符 、-- 的使用4.2.4 关系运算符&#xff1a;>、 < 、> 、<、 ! 、4.2.5 逻辑运算符&#xff1a;&& || ! ^ & |4.2.6 位运算符&#xff1a;~ 、^、 &…...

第十五章总结

一.输入/输出流 1.输入流 InputStrema类是字节输入流的抽象类&#xff0c;它是所有字节输入流的父类。 该类中所有方法遇到错误都会引发IOException异常。 read()方法&#xff1a;从输入流中读取数据的下一个字节。返回0~255的int字节值。如果因为已经到达流末尾而没有可用的…...

音频I2S

前言 基于网上资料对相关概念做整理汇总&#xff0c;部分内容引用自文后文章。 学习目标&#xff1a;简单了解相关概念、相关协议。 1 概述 数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信…...

小程序中的合法域名的作用及条件有哪些?

小程序的合法域名是指小程序项目中使用的各种接口、资源文件等所在的域名。在小程序开发中&#xff0c;需要将这些域名添加到小程序后台的“开发设置”-“服务器域名”中进行配置&#xff0c;才能够正常使用。 合法域名的作用&#xff1a; 1.作为小程序请求的 API 服务器域名…...

SpringData JPA 整合Springboot

1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…...

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion 黑白老照片上色修复

在这个时代,我们习惯于拥有高清、色彩丰富的照片,然而,那些古老的黑白色老照片由于年代的久远,往往会出现模糊、破损等现象。 那么今天要给大家介绍的是,用 Stable Diffusion 来修复老照片。 前段时间 ControlNet 的除了上线了“IP-Adapter”模型以外还增加另一个…...

第十三章总结

一.泛型 1.定义泛型类 泛型机制语法&#xff1a; 类名<T> 其中&#xff0c;T是泛型的名称&#xff0c;代表某一种类型。 【例13.6】创建带泛型的图书类 代码&#xff1a; 结果&#xff1a; 2.泛型的常规用法 (1)定义泛型类时声明多个变量 class MyClass<T1,T2…...

大模型应用_PrivateGPT

https://github.com/imartinez/privateGPT 1 功能 整体功能&#xff0c;想解决什么问题 搭建完整的 RAG 系统&#xff0c;与 FastGPT相比&#xff0c;界面比较简单。但是底层支持比较丰富&#xff0c;可用于知识库的完全本地部署&#xff0c;包含大模型和向量库。适用于保密级…...

[Android] ubuntu虚拟机上搭建 Waydroid 环境

1.安装虚拟机 略 2.安装waydroid Ubuntu/Debian and derivatives For Droidian and Ubuntu Touch, skip directly to the last step Install pre-requisites sudo apt install curl ca-certificates -y Add the official repository curl https://repo.waydro.id | sudo…...

LeedCode刷题---滑动窗口问题(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、将X减到0的最小操作数 题目链接&#xff1a;将 x 减到 0 的最小操作数 题目描述 给你一个整数数组 nums 和一个整数 x 。每一…...

pycharm依赖管理(不要用pip freeze)

在使用python虚拟环境时&#xff0c;可以使用requirements.txt来管理当前项目的依赖。 注意&#xff0c;不要用 pip freeze > requirements.txt 这个命令&#xff0c;因为它会引入很多无关的包。 可以使用 pipreqs ./ --encodingutf-8 ./ 表示当前项目的目录&#xff0…...

[Kafka 常见面试题]如何保证消息的不重复不丢失

文章目录 Kafka1. Kafka如何保证不丢失消息&#xff1f;生产者数据的不丢失消费者数据的不丢失Kafka集群中的broker的数据不丢失 2. Kafka中的消息是否会丢失和重复消费&#xff1f;1. 消息发送2. 消息消费 3. Kafka 的设计是什么样的呢&#xff1f;4. 数据传输的事务定义有哪三…...

Java中System.setProperty()用法

Java中System.setProperty()用法 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一起深入了解Java中的System.setProperty()方法&#xff0c…...

Eclipse 自动生成注解,如果是IDEA可以参考编译器自带模版进行修改

IDEA添加自动注解 左上角选择 File -> Settings -> Editor -> File and Code Templates&#xff1b; 1、添加class文件自动注解&#xff1a; ​/*** <b>Function: </b> todo* program: ${NAME}* Package: ${PACKAGE_NAME}* author: Jerry* date: ${YEA…...

微信小程序vant安装使用过程中遇到无法构建npm的问题

官网地址&#xff0c;然而如果完全按照这个教程来&#xff0c;实际上是缺少步骤的&#xff0c;需要补充一些步骤&#xff08;参考https://www.bilibili.com/video/BV1vL41127Er&#xff09; # 这步init就是补充的 npm init npm i vant/weapp -S --production# 剩下的按照vant的…...

[python]用python获取EXCEL文件内容并保存到DBC

目录 关键词平台说明背景所需库实现过程方法1.1.安装相关库2.代码实现 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 背景 在搭建自动化测试平台的时候经常会提取DBC文件中的信息并保存为excel或者其他文件格式&#xff0c;用于自动化测试。本文…...

Spring Boot 如何配置 log4j2

Log4j2 介绍 Spring Boot 中默认使用 Logback 作为日志框架&#xff0c;接下来我们将学习如何在 Spring Boot 中集成与配置 Log4j2。在配置之前&#xff0c;我们需要知道的是 Log4j2 是 Log4j 的升级版&#xff0c;它在 Log4j 的基础上做了诸多改进&#xff1a; 异步日志&…...

如何安装docker

安装Docker的步骤取决于您使用的操作系统。以下是常见操作系统上安装Docker的基本步骤&#xff1a; 对于Linux: 更新软件包索引&#xff1a; sudo apt-get update安装允许apt通过HTTPS使用仓库的包&#xff1a; sudo apt-get install apt-transport-https ca-certificates cur…...

Linux 之 性能优化

uptime $ uptime -p up 1 week, 1 day, 21 hours, 27 minutes$ uptime12:04:11 up 8 days, 21:27, 1 user, load average: 0.54, 0.32, 0.23“12:04:11” 表示当前时间“up 8 days, 21:27,” 表示运行了多长时间“load average: 0.54, 0.32, 0.23”“1 user” 表示 正在登录…...

用Go汇编实现一个快速排序算法

本代码全网首发&#xff0c;使用Go plan9 windows arm64汇编&#xff0c;实现基础版快速排序算法。 未引入随机因子的快速排序的普通Go代码长这样。 func QuickSort(arr []int) {if len(arr) < 1 {return}base, l, r : arr[0], 0, len(arr)-1for i : 1; i < r; {if arr…...

Spring-整合MyBatis

依赖 <dependencies><!--提供数据源--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--提供sqlSessionFactory…...

sql宽字节注入

magic_quotes_gpc&#xff08;魔术引号开关&#xff09; https://www.cnblogs.com/timelesszhuang/p/3726736.html magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据&#xff0c;如包括有&#xff1a;post、get、cookie过来的数据增加转义字符“\”&#xff0c;以…...

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

一、介绍 今天我们来聊一聊关于LLM的微调训练&#xff0c;LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型&#xff0c;但它具备理解和生成人类语言的能力&#xff0c;非常厉害&#xff01;它可以革新各个行业&#xff0c;包括自然语言处理、机器翻译、…...

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…...

2023/12/17 初始化

普通变量&#xff08;int,float,double变量&#xff09;初始化&#xff1a; int a0; float b(0); double c0; 数组初始化&#xff1a; int arr[10]{0}; 指针初始化&#xff1a; 空指针 int *pnullptr; 被一个同类型的变量的地址初始化&#xff08;赋值&#xff09; int…...

【算法Hot100系列】三数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

CSS 简介

什么是 CSS? CSS 是层叠样式表(Cascading Style Sheets)的缩写,是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言。 CSS 的主要作用是: 控制网页的样式,如字体、颜色、背景、布局等提高网页的开发效率CSS 的语法 CSS 的…...

myBatis-plus自动填充插件

在 MyBatis-Plus 3.x 中&#xff0c;自动填充的插件方式发生了变化。现在推荐使用 MetaObjectHandler 接口的实现类来定义字段的填充逻辑。以下是使用 MyBatis-Plus 3.x 自动填充的基本步骤&#xff1a; 1.基本配置 1.1添加 Maven 依赖&#xff1a; 确保你的 Maven 依赖中使…...

自己如何搭建网站/微信营销软件排行榜

转自https://www.cnblogs.com/subconscious/p/4660952.html 一.前言 今天继续我们EasyPR的开发详解。 这几个月我收到了不少的邮件问&#xff1a;为什么EasyPR开发详解教程中只有车牌定位的部分&#xff0c;而没有字符识别的部分&#xff1f; 这个原因一是由于整个开发详解是按…...

做网站较好的框架/长沙网站seo诊断

phpStudy在windows上配置php运行环境非常方便&#xff0c;使用简单省心。在本地调试wordpress网站&#xff0c;我就是用phpStudy来配置环境的&#xff0c;可是最近遇到一个烦心的事情&#xff0c;就是phpStudy一直运行良好&#xff0c;突然Apache和MySQL服务就启动不了。故障的…...

政府网站建设 江苏省/百度新闻官网

Android的包文件APK分为两个部分&#xff1a;代码和资源&#xff0c;所以打包方面也分为资源打包和代码打包两个方面&#xff0c;这篇文章就来分析资源和代码的编译打包原理。 具体说来&#xff1a; 1.通过AAPT工具进行资源文件&#xff08;包括AndroidManifest.xml、布局文件、…...

政府网站建设情况/网络外包

本文记录了mysql 8.0.15 安装配置的方法&#xff0c;供大家参考&#xff0c;具体内容如下1. MySQL安装1.1 在MySQL官网 下载 Windows 版本的 MySQL 安装包下载地址点击下载Download后会弹出以下界面&#xff0c;点击 No thanks, just start my download1.2 下载完后解压&#x…...

专业制作网站多少钱/大数据分析网站

前言 我们平时项目开发中&#xff0c;经常会有很多类似的代码文件&#xff0c;而我们在使用的时候也会经常的去复制粘贴。为此我之前也写过一篇文章&#xff0c;探讨过提高开发效率的方法&#xff0c;但是说实话&#xff0c;也并不是很好用。 看如今火热的前端框架&#xff0…...

廊坊开发区规划建设局网站/1000个关键词

做一件事&#xff0c;如果觉得难那就对了。容易达成的事&#xff0c;没有经过努力获取到的是没有成就感的。人生就像上坡&#xff0c;更高处的风景更值得期待。中国人民大学与加拿大女王大学金融硕士项目给予你前行的力量。 我们每个人的一生中&#xff0c;都是在不断攀登一座…...