Java8实战笔记:第一部分(1~3章)

article/2025/9/21 19:21:40

1.为什么关心Java8

和大多数书本一样,书本的第一章都起统领全书的作用,上来就是一个疑问?Java8怎么还在变,语言的变化离不开程序员对性能和代码简化的需求,进而引出了流处理、Lambda表达式、方法引用、并行化的相关概念

1.1 Java 怎么还在变

  1. Java 在编程语言生态系统中的位置
  2. 流处理 ——流是一系列数据项,一次只生成一项
  3. 用行为参数化把代码传递给方法
  4. 并行与共享的可变数据
  5. Java 需要演变

1.2 Java中的函数

Java8中新增了函数——值的一种新形式

前提是listFiles方法接收一个方法作为参数

谓词(predicate):在数学上常常用来代表一个类似函数的东西,它接受一个参数值,并返回 true 或 false 。你在后面会看到,Java 8也会允许你写 Function<Apple,Boolean> ——在学校学过函数却没学过谓词的读者对此可能更熟悉,但用 Predicate 是更标准的方式,效率也会更高一点儿,这避免了把 boolean 封装在 Boolean 里面。(通俗来讲就是一个返回boolean值的函数)

1.3 流

你需要从一个列表中筛选金额较高的交易,然后按货币分组。

Stream

有了Stream API,你根本用不着操心循环的事情。数据处理完全是在库内部进行的。我们把这种思想叫作内部迭代。

1.3.2 并行流

Collection主要是为了存储和访问数据,而Stream则主要用于描述对数据的计算。

如何利用Stream和Lambda表达式顺序或并行地从一个列表里筛选比较重的苹果。

使用并行

理想的情况下,你会希望做 list.sort(comparator) ,而不是 Collections.sort(list, comparator) 。前者不是并行,后者既不是并行也不是面向对象语法。

Java中从函数式编程中引入的两个核心思想:将方法和Lambda作为一等值,以及在没有可变共享状态时,函数或方法可以有效、安全地并行执行。

2. 通过行为参数化传递代码

2.1 行为参数化

让我们定义一个接口来对选择标准建模:

你刚做的这些和“策略设计模式” 相关,它让你定义一族算法,把它们封装起来(称为“策略”),然后在运行时选择一个算法。

最终的代码

2.2 可以使用匿名类

策略模式其实挺麻烦的,因为每一个策略都是一个实现类,会造成大量的文件,而且如果不是经常重复使用的话,对系统来说未免有点浪费。所以,对使用一次的策略,建议直接使用匿名类。

匿名类:面试中常问的接口可以实现吗?其实说的就是匿名类

匿名类谜题

答案是5,因为this指的是包含它的Runnable,而不是外面的类MeaningOfThis

3. Lambda表达式

可以把Lambda表达式理解为简介地表示可以传递的匿名函数的一种方式:它没有名称,但他有参数列表、函数主体、返回类型,可能还有一个可以跑出的异常列表。

  • 匿名——我们说匿名,是因为它不像普通的方法那样有一个明确地名称:写得少而想得多(鸡肋)
  • 函数——我们说它是函数,是因为Lambda函数不像方法属于某个特定的类。但和方法一样,Lambda有参数列表、函数主体、返回类型,还有可能跑出的异常列表。
  • 传递——Lambda表达式可以作为参数传递给方法或存储在变量中
  • 简介——无需像匿名类那样写很多模板代码。

Lambda表达式

Lambda有三个组成部分

  • 参数列表
  • 箭头
  • Lambda主体

注意:使用return显式返回的时候,要有花括号{};同理,有{},就要有return

对比匿名类

3.1 Lambda示例

3.2 在哪里以及如何使用Lambda

3.2.1 函数式接口

哪怕有再多的默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口

3.2.2 函数描述符

函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作函数描述符。。例如, Runnable 接口可以看作一个什么也不接受什么也不返回( void )的函数的签名,因为它只有一个叫作 run 的抽象方法,这个方法什么也不接受,什么也不返回( void )

**@FunctionalInterface又是怎么回事? **
如果你去看看新的Java API,会发现函数式接口带有 @FunctionalInterface 的标注。这个标注用于表示该接口会设计成一个函数式接口。如果你用 @FunctionalInterface 定义了一个接口,而它却不是函数式接口的话,编译器将返回一个提示原因的错误。例如,错误消息可能是“Multiple non-overriding abstract methods found in interface Foo”,表明存在多个抽象方法。请注意, @FunctionalInterface 不是必需的,但对于为此设计的接口而言,使用它是比较好的做法。它就像是 @Override标注表示方法被重写了。

3.2.3 异常、Lambda,还有函数式接口

请注意,任何函数式接口都不允许抛出受检异常(checked exception)。如果你需要Lambda表达式来抛出异常,有两种办法:定义一个自己的函数式接口,并声明受检异常,或者把Lambda包在一个 try/catch 块中。

3.3 类型检查、类型推断

Lambda的类型是从使用Lambda的上下文推断出来的。上下文(比如,接受它传递的方法的参数,或接受它的值的局部变量)中Lambda表达式需要的类型称为目标类型。

3.4 使用局部变量

3.5 方法引用

方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。

3.5.1 构建方法引用

  1. 指向静态方法的方法引用(例如 Integer 的 parseInt 方法,写作 Integer::parseInt)
  2. 指 向 任 意 类 型 实 例 方 法 的 方 法 引 用 ( 例 如 String 的 length 方 法 ,写 作String::length )。
  3. 指向现有对象的实例方法的方法引用(假设你有一个局部变量 expensiveTransaction用于存放 Transaction 类型的对象,它支持实例方法 getValue ,那么你就可以写 expensiveTransaction::getValue )。

3.5.2 构造函数引用

3.5.3 奥义:工厂

3.6 Lambda表达式的符合方法

//1. 逆序
inventory.sort(comparing(Apple::getWeight).reversed());
//2. 比较器链
inventory.sort(comparing(Apple::getWeight) .reversed()  .thenComparing(Apple::getCountry));

附录

常见函数接口

接口描述原始类型特化
Predicate<T>定义了一个test的抽象方法,(T)->booleanIntPredicate,
LongPredicate,
DoublePredicate
Consumer<T>定义了一个accept的抽象方法,(T)->voidIntConsumer,
LongConsumer,
DoubleConsumer
Function<T,R>定义了一个apply的抽象方法,(T)->RIntFunction<R>,
IntToDoubleFunction,
IntToLongFunction,
LongFunction<R>,
LongToDoubleFunction,
LongToIntFunction,
DoubleFunction<R>,
ToIntFunction<T>,
ToDoubleFunction<T>,
ToLongFunction<T>
Supplier<T>定义了一个get的抽象方法 () -> TBooleanSupplier,
IntSupplier,
LongSupplier,
DoubleSupplier
UnaryOperator<T>继承自Function<T,R>,独有的UnaryOperator方法(未知用处)IntUnaryOperator,
LongUnaryOperator,
DoubleUnaryOperator
BinaryOperator<T>继承自BiFunction<T,T,T>IntBinaryOperator,
LongBinaryOperator,
DoubleBinaryOperator
BiPredicate<L,R>test抽象方法,(T,U)->boolean
BiConsumer<T,U>accept,(T,U)->voidObjIntConsumer<T>,
ObjLongConsumer<T>,
ObjDoubleConsumer<T>
BiFunction<T,U,R>定义了一个apply抽象方法,(T,U)->RToIntBiFunction<T,U>,
ToLongBiFunction<T,U>,
ToDoubleBiFunction<T,U>

练习

  1. 把int数组变为integer数组(1.5.反过来)
int[] nums = new int[]{1,2,3,4,5,6};
Integer[] integers = Arrays.stream(nums).boxed().toArray(Integer[]::new);
//====================
Integer[] nums = new Integer[]{1,2,3,4,5,6};
int[] ints = Arrays.stream(nums).mapToInt(Integer::valueOf).toArray();
  1. 1030. 距离顺序排列矩阵单元格

class Solution {public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {int[][] res = new int[R*C][2];int k = 0;for(int i = 0;i<R;i++){for(int j=0;j<C;j++){res[k++] = new int[]{i,j};}}Arrays.sort(res, (o1, o2) -> {return (Math.abs(o1[0] - r0) + Math.abs(o1[1] - c0)) - (Math.abs(o2[0] - r0) + Math.abs(o2[1] - c0));});return res;}
}

http://chatgpt.dhexx.cn/article/gsZrMru5.shtml

相关文章

java 遍历目录下所有文件_java实现遍历某个目录(包括子目录)下的所有文件

在java中遍历一个文件夹里边的所有文件,可以有两种方式: 一、递归遍历 通常也是开发者第一时间能想到的方法。 递归遍历的优点是: 实现起来相对简单,代码量相对较少,执行效率较高。 缺点是: 比较吃内存,对硬件要求较高。 在线视频教程分享:java在线视频 具体算法如下:…

java解压缩gzip_利用Java实现压缩与解压缩(zip、gzip)支持中文路径

zip扮演着归档和压缩两个角色&#xff1b;gzip并不将文件归档&#xff0c;仅只是对单个文件进行压缩&#xff0c;所以&#xff0c;在UNIX平台上&#xff0c;命令tar通常用来创建一个档案文件&#xff0c;然后命令gzip来将档案文件压缩。 Java I/O类库还收录了一些能读写压缩格式…

ubuntu-20.04 Astra-pro configuration

In function ‘char* strncpy(char*, const char*, size_t)’, inlined from ‘Agent::queryLocalData(std::string&, ResponseDataT&)’ at ./Agent/Agent.cc:715:14: /usr/include/x86_64-linux-gnu/bits/string_fortified.h:106:34: error: ‘char* __builtin_s…

Java中获取本地某一个目录下的所有文件和文件夹

在从事web开发工作中&#xff0c;经常需要对本地某一个目录下的文件进行处理&#xff0c;而在这之前&#xff0c;我们需要做的就是获取到这个目录下的文件。 1 String filepath "D:\file";//D盘下的file文件夹的目录 2 File file new File(filepath);//File类型可以…

企业微信和个人微信的区别

从 个人身份、朋友圈、加好友、社群管理、数据统计&#xff0c;这5个方面来进行对比&#xff1a; 一、 个人身份 企业微信和个人微信有一个很大的区别&#xff0c;就是企业品牌的展示。 企业微信自带一个品牌的小尾巴&#xff0c;当用户初次添加你时&#xff0c;企微自带的品牌…

企业微信or个人微信?三个角度让你不再纠结

如今承载了12亿用户的企业微信已经与微信环境做到高度的融合互通&#xff0c;如实现了互相添加好友等功能&#xff0c;可以看出腾讯推动企业微信扩大商用场景的决心。回想2020年5月某社群工具被封杀后&#xff0c;微信社群运营就一夜回到解放前人工成本高企的状态&#xff0c;那…

安卓移动开发初步——微信页面制作

进行APP门户制作时选择在Android studio中建立简单的微信页面&#xff0c;内容包括&#xff1a; ①页面布局与微信页面基本相似&#xff1b; ②点击图标能实现页面的切换&#xff1b; ③点击图标时有选中效果(图标亮起)&#xff1b; 目录 效果图 底部布局实现 顶部布局实现…

微信小程序 java家庭个人收支理财记账本springboot

该系统主要分为登录注册、资金管理、统计报表、趋势图线、个人信息五大模块。 登录管理:新用户填写相关的注册信息&#xff0c;获得登陆账号和密码&#xff0c;已注册用户通过账号和密码登录系统。 资金管理:用户登录到系统后可以通过资金管理对家庭资金进行管理&#xff0c;包…

微信公众号基础入门知识

微信公众号的类型微信公众号一共有四种账号类型&#xff0c;除了我们日常接触的订阅号和服务号外&#xff0c;还包括企业微信和小程序。 订阅号 订阅号主要偏向于为用户传达资讯&#xff0c;其功能类似于报纸杂志&#xff0c;为读者传播消息&#xff0c;每天可以群发一次消息。…

如何零基础创建自己的微信小程序

目录 创建微信小程序 步骤&#xff1a; 1、打开浏览器搜索微信公众平台 2、一般是先要注册的&#xff08;当然已经有的就不需要了&#xff09; 3、选择注册的类型 关于“小程序怎么开发自己的小程序”这个不少人关注的问题&#xff0c;小编针对性的给出详细教程&#xff0c;…

微信云托管体验

最近在了解微信云托管&#xff0c;体验了一番&#xff0c;很好用。 我觉得微信云托管是降低了运维的难度&#xff0c;可以不用在购买服务器了&#xff0c;直接使用微信云托管环境很方便。 摘自微信官方文档&#xff1a;微信云托管 是微信团队提供的以云原生为基础的&#xff0…

微信OAuth2.0授权登录

微信OAuth2.0授权登录 OAuth2.0简介OAuth2的应用微服务安全社交登录 网页微信登录前期准备授权流程 服务器端开发需求网页显示二维码返回微信登录参数添加配置添加配置类controller 前端显示登录二维码封装api请求 处理微信回调添加httpclient工具类添加回调接口获取access_tok…

个人申请微信公众号步骤(含截图)

1.打开微信公众平台&#xff1a;https://mp.weixin.qq.com&#xff0c;点击“立即注册” 2.选择“注册账号类型”为“订阅号” 3.填写信息&#xff0c;注意一个邮箱只能注册一次&#xff0c;且后期不能更改。如果你的邮箱之前注册个“微信小程序”账号也是不能用的。 4.点击“…

仿制微信/QQ在线聊天网站

webchat 一款基于Javascriptexpresssocket.io构成的网络在线聊天应用 &#x1f61a;项目仍在维护中&#xff0c;欢迎各位大佬PR&#x1f389;和star⭐ 具体效果可以访问http://chat.chuyuxuan.xyz:4400 2020年10月10日前该链接有效&#xff0c;别问为啥&#xff0c;问就是服…

电商卖家做微营销是该做微信个人号还是公众号?

近两年&#xff0c;关于传统企业转型、微营销、社交电商、工业4.0什么的炒作如火如荼&#xff0c;不管是传统企业还是创业团队&#xff0c;无一不关注微信营销。很多线下品牌和电商品牌&#xff0c;都纷纷布局微信营销&#xff0c;或者将微信个人号及公众号作为店铺粉丝和老客户…

Android app集成微信支付

Android app集成微信支付 鉴于微信支付的文档入口不太容易找到、以及文档中有些逻辑不通或者容易产生歧义或者缺失一些信息的情况&#xff0c;记录下此次接入的流程和需要关注的一些点。 使用的是app支付-> APP支付产品介绍 首先阅读介绍等&#xff0c;了解一些基础的概念…

集成微信登录

目录标题 集成微信登录1、OAuth21.1 作用1.2 多方授权的解决方法1.3 OAuth2最简向导1.4 OAuth2的应用 2、微信登录介绍2.1 前期准备2.2 授权流程 3、服务器端开发3.1 返回微信登录参数3.2 前端显示登录二维码3.3 处理微信回调3.4 回调返回页面 集成微信登录 1、OAuth2 1.1 作…

微信数据库解析总结

1.微信数据库解密 微信数据库在在哪个文件夹 EnMicroMsg.db的父文件加密规则是 md5("mm" uin)这样就可以准确的获取到db文件的位置. uin的获取&#xff1a;/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml里面有个uinz字段&#xff0c;直接获取val…

微信个人公众号推广

作者&#xff1a;余伟峰链接&#xff1a;https://www.zhihu.com/question/34151231/answer/118281456来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 &#xff08;转&#xff09; 个人公众号常见的运营和推广可以参考以…

微信小程序云开发|个人博客小程序

&#x1f315;文章目录 1.前言2.博客首页数据展示3.使用data中的数据渲染博客展示4.使用云数据库创建集合blogs5.读取数据库中的数据6.创建添加博客页面7.博客添加页面样式设计8.总结 1.前言 这篇文章详细的介绍了个人博客小程序的云开发流程&#xff0c;包括博客展示页面&…