[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
.
- collect(Collectors.toList()). 目标结果为
更多值得注意的是. 之前和朋友提到过一个问题. 我们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
[Java8] lamda表达式及Stream API一览相关推荐
- Java8 Lambda表达式(三)Lambda表达式与Stream API
目录 1 Stream基本概念 1.1 什么是Stream 1.2 Stream的特点 2 Stream API初体验 2.1 构造数据 2.1 使用for循环实现 2.2 使用Lambda表达式结合 ...
- 【java8新特性】——Stream API详解(二)
一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...
- java8新特性-lambda表达式和stream API的简单使用
一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...
- 【Java】Java8新特性Lambda表达式和Stream API
Lambda表达式是实现支持函数式编程技术的基础. 函数式编程与面向对象编程:函数式编程将程序代码看作数学中的函数,函数本身作为另一个函数参数或返回值,即高阶函数.而面向对象编程按照真实世界客观事物的 ...
- java8(2)--- Stream API
1.简述 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一 个就是 Stream API. Stream 是处理集合的抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复 ...
- java8(三)Stream API
文章目录 Stream API Stream和Collection的区别 Stream操作的三个步骤 创建Stream 方法一:通过集合创建 方法二:通过数组创建 通过Stream类的静态方法 of创 ...
- lamda表达式和stream
stream主要用于处理数据,看一下jdk的文档,并且主要处理集合对象: int sum = widgets.stream() .filter(w -> w.getColor() == RED) ...
- java8 lamda表达式相等_java8之lambda表达式(lambda表达式语法)
到目前为止,在Java中向其他代码传递一段代码并不是很容易.你不可能将代码块到处传递.由于java是一个面向对象的语言,因此你不得不构建一个属于某个类的对象,由它的某个方法来包含所需的代码. lamb ...
- lambda ::表达式_Lambda表达式和流API:基本示例
lambda ::表达式 这篇博客文章包含基本Lambda表达式和Stream API示例的列表,我在2014年6月在Java用户组Politechnica Gedanensis (格但斯克技术大学) ...
最新文章
- java pop邮件 源码_[源码和文档分享]基于JavaMail的邮件收发系统
- LeetCode 38外观数列39组合总和
- like ,order 使用索引
- 接口幂等性问题解决方案
- 浅谈c语言中的字符串
- xdebug怎样在php中配置,教你在PHPStorm中配置Xdebug
- Linux的实际操作:任务调度基本说明
- golang mysql 自动建表_mysql表结构自动生成golang struct
- 2_数据分析—认识pandas
- sparksql优化_Spark SQL amp; Streaming
- 剖析 |数据现代化-富国银行的数据转型之路
- 谭浩强c语言程序设计 在线,C语言程序设计_谭浩强.pdf
- 大型仿人机器人整机构型研究与应用
- 新发现几个百度网盘/阿里云盘搜索资源站,还能查询网盘提取码
- java 闰年闰月_闰年闰月查询表
- 「2020总结文章」一起回顾 2020,展望 2021(JesksonUI-UniApp)
- 基于Java的大型网站设计方案
- 使用deepin 20作为开发环境
- 计算机课情感态度与价值观,浅谈信息技术课中情感态度价值观的培养
- 登录系统提示请求数据成功!但回调方法出错;请检查自定义load回调函数。有没有大佬能给解答下这种怎么处理
热门文章
- libQtSerialPort.so:-1: error: file format not recognized; treating as linker
- python字典排序|按值排序|按键排序
- java实现简易超市管理系统01(含源码)
- Linux:文件查询命令
- php 页面图片无缝滚动,js实现图片无缝滚动
- 我是如何从低端面畜到高端面霸的?
- get荣耀YOYO智能音箱打电话的新技能 感觉赚了1个亿
- CodeForces12D 树状数组降维
- 苹果x漫画脸_《名侦探柯南》漫画时间线索整理简化重置版(6)(总FILE.311~FILE.360)...
- 万字详文:彻底搞懂 Jest 单元测试框架