[Java8] lamda表达式及Stream API一览 Bertha 。 2022-09-13 00:24 124阅读 0赞 ### 前言 ### 不知道从什么时候开始. 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 新特性][Java 8] \[2\]. [(菜鸟教程)Java 8 Stream][Java 8 Stream] [Java 8]: https://www.runoob.com/java/java8-new-features.html [Java 8 Stream]: https://www.runoob.com/java/java8-streams.html
相关 Java 8新特性:Lambda表达式、Stream API等 是的,Java 8引入了许多新的特性,其中最显著的就是Lambda表达式和Stream API。 1. Lambda表达式: 简单来说,Lambda表达式就是一种更简洁 向右看齐/ 2024年09月15日 00:27/ 0 赞/ 23 阅读
相关 Java 8新特性:Lambda表达式及Stream API示例 Lambda表达式和Stream API是Java 8的重要新特性,它们使得处理集合数据更加简洁高效。 1. Lambda表达式 Lambda表达式是一种匿名函数的简写方式 骑猪看日落/ 2024年09月11日 06:03/ 0 赞/ 20 阅读
相关 java Lamda表达式 java8新特性,Lamda是一个匿名函数,类似Python中的Lamda表达式、js中的箭头函数,目的简化操作。 为什么要使用Lamda? 可以对一个接口进行非常简洁的 约定不等于承诺〃/ 2022年10月11日 03:58/ 0 赞/ 109 阅读
相关 [Java8] lamda表达式及Stream API一览 前言 不知道从什么时候开始. Java8开始刮起了一阵妖风. 那就是lamda表达式. 也叫函数式编程, 大概是和隔壁的Scala进行学习吧. 但是Java8也是甲骨文最 Bertha 。/ 2022年09月13日 00:24/ 0 赞/ 125 阅读
相关 Java8 Stream API Java8 Stream API Stream是啥 创建流 创建一个空的流 朴灿烈づ我的快乐病毒、/ 2022年05月31日 11:59/ 0 赞/ 147 阅读
相关 Java 8-Stream API 流处理 流是一系列数据项,一次只生产一项。程序可以从输入流中一个一个读取数据项,然后以同样的方式将数据项写入输出流。一个程序的输出流很可能是另一个程序的输入流。 流,简 我不是女神ヾ/ 2022年05月21日 06:54/ 0 赞/ 132 阅读
相关 Java8Stream API Stream (java.util.stream.\)是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。 Bertha 。/ 2022年05月15日 13:55/ 0 赞/ 189 阅读
相关 【Java8】Lambda表达式与Stream API Java8与Java7最大的改变就是Lambda表达式和Stream API了。java8给我们开发提供了很多的便利,这些我们该了解。 一、Lambda优化了什么? L 迈不过友情╰/ 2022年05月15日 00:16/ 0 赞/ 138 阅读
相关 java lamda stream example if(StringUtils.isNotBlank(listResultStr)){ BaseResult<List<Order>> result = 分手后的思念是犯贱/ 2022年01月05日 13:15/ 0 赞/ 157 阅读
还没有评论,来说两句吧...