IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> [Java8] lamda表达式及Stream API一览 -> 正文阅读

[Java知识库][Java8] lamda表达式及Stream API一览

前言

不知道从什么时候开始. Java8开始刮起了一阵妖风. 那就是lamda表达式. 也叫函数式编程, 大概是和隔壁的Scala进行学习吧. 但是Java8也是甲骨文最后一个免费的版本. 大概率, 很多的中小型公司都会选择停留在这个版本. 虽然这个版本没有ZGC垃圾回收, 但是面对10G-100G左右内存规模的程序, 也应该够了.


初识lamda表达式

lamda表达式最大的特性就是简化了for循环的编写方式. 多说无益, 我们举个例子进行编写吧.

  • for循环写法
List<Integer> helloArrayList = new ArrayList<>();
for(String str : helloArratList){
	str = str+"a";
}
  • lamda表达式写法
List<Integer> helloArrayList = new ArrayList<>();
// 注意lamda表达式中map处理完之后要使用collect收集. 并且赋值回去.
helloArrayList = helloArrayList.stream().map(str -> str+"a").collect(Collections.toList());

这样看起来是不是很简单? 好像也不是… 但是当多个算子聚合操作的时候, 你会感觉出来的. 特别其还有一些比较喜欢的Map转换器.


map() 支持表达式的三种写法

差点忘了这一部分. 我们初学者写的时候非常苦恼. 其中的表达式有三种变种. 我们需要熟悉他们:

  • map(a -> b)
    这部分的算子一般比较简单. 一行代码即可通过.

  • map(a -> {return a+b;})
    这种一般适合复杂的计算. 比如:

map(a -> {
	a = a+1;
	int. b. = 2;
	a = a+b;
	return a;
})
  • map(String::charAt)
    这一部分经常是动态的调用某个静态方法. 比如 filter(Objects::notNull). 其实你不熟悉这种, 也无所谓. 能看懂即可.

三种写法是不是很像,孔乙己的回字的几种写法, 哈哈. 有种八股文的味道了.


Java8 lamda表达式算子介绍

在这里给出一些, 我在工作中使用比较多的算子.

  • map()
    大名鼎鼎的map()算子. map通常的写法为xxx.stream().map(object -> objectxxxxx); 值得注意的是, 我初始的时候并不知道object这个变量写什么好. 其实, 写多了之后, 会发现, 其可以任意指定. 其次, 当做业务开发时, 这个值最好和业务相关的. 比如bookArrayList.stream().map(book -> { return abc;})

  • collect()
    这个算子中方法的变种比较多. 比如:

    • collect(Collectors.toList()). 目标结果为List<>abcList.
    • collect(Collectors.toMap(a.key ,a->a,(a1,a2)->a1)) . 目标结果为Map<keyType, valueType> map. 这种需要注意map出现key重名情况. 获取key有时也有传递方法体的. 例如: collect(Collectors.toMap(Object::getHashCode ,a->a,(a1,a2)->a1))
      collect(Collectors.toMap(a.key ,a->a,(a1,a2)->a1)).
    • collect(Collectors.groupByMap(Object::getHashCode)). 目标结果为Map<keyType, List<valueType>>. 注意, 这种是不需要考虑key重名的情况的.
    • collect(Collectors.toSet()). 目标结果为Set<> abcSet.

更多值得注意的是. 之前和朋友提到过一个问题. 我们Collectors.toMap() 和 Collectors.groupByMap我们转换为map()的时候. 我们会出现key为null或者为""(空字符串)的情况么?
答: 答案很简单. 是会出现的. 那么转换为Set是否也会出现? 答案仍然是肯定的.

  • filter()
    过滤器. 通常做一些筛选. 如果我要筛选不为null的情况. 那么表达式可以写为: filter(a -> null != a)/filter(a -> {return null!=a;})/ filter(Objects:notNull). 注意这部都是只有bool为true时才能通过.

  • foreach()
    注意如果对于一个list来说. 你不想获取返回值. 那么可以直接forEach. 同样的对于Map类型来说, 也只有forEach方法.

Map<String, String> helloMap = new HashMap();
helloMap.forEach( (key,value) ->{
	System.out.println(hellpMap);
});
其余不常用的算子
  • parallelStream
  • sorted

比较难用的点

个人在使用过程中, 难用的点有如下几种:

  • 难以调试&难以阅读
    如果你把所有的算子都写在一行的话. 那么读和调试都异常困难. 估计和你合作开发的人肯定会diss你, 哈哈. 个人推荐使用IDEA的Google的代码结构化换行工具. 这个前面的IDEA工具内有介绍过. 这边稍后会给个链接.

  • 有时不能赋值给某个非final变量
    这个说的有点抽象. 等有合适的例子再补充在这里吧.

  • 无法使用下标获取. 当然如果想要下标, 还是需要老老实实写成for(int i-0; i<arrayList.length;i++){ arrayList.get(i);}


Reference

[1]. (菜鸟教程)Java 8 新特性
[2]. (菜鸟教程)Java 8 Stream

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 13:57:03  更:2021-09-27 13:58:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:30:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码