java8新特性之Lambda流常用表达式的方法合集
我们日常工作中,对于数据遍历、分组以及转换需要大量代码实现,借助java8新特性—LambdaLambda 流操作,几行代码可以帮助我们实现复杂代码,这里把 Lambda 流的常用方法用案列讲解一下。
ForEach
集合的遍历 forEach 方法:
public void testForEach(){List<String> list = new ArrayList<String>() {{add("小明");add("小张");add("小李");}};//遍历list.forEach(s-> System.out.println(s));}
Collect
将操作后的对象转化为新的对象:
public void testCollect(){List<String> list = new ArrayList<String>() {{add("小明");add("小张");add("小李");}};//转换为新的listList newList = list.stream().map(s -> Integer.valueOf(s)).collect(Collectors.toList());}
Filter
Filter 为过滤的意思,只要满足 Filter 表达式的数据就可以留下来,不满足的数据被过滤掉。
public void testFilter() {List<String> list = new ArrayList<String>() {{add("小明");add("小张");add("小李");}}; list.stream()// 过滤掉我们希望留下来的值// 表示我们希望字符串是 “小李” 能留下来// 其他的过滤掉.filter(str -> "小李".equals(str)).collect(Collectors.toList());}
Map
map 方法可以让我们进行一些流的转化,比如原来流中的元素是 A,通过 map 操作,可以使返回的流中的元素是 B。
public void testMap() {List<String> list = new ArrayList<String>() {{add("zhang san");add("li si");add("wang wu");}};//通过map方法list中元素转化成小写List<String> strLowerList = list.stream().map(str -> str.toLowerCase()).collect(Collectors.toList());}
MapToInt
mapToInt 方法的功能和 map 方法一样,只不过 mapToInt 返回的结果已经没有泛型,已经明确是 int 类型的流了。
源码如下:
public void testMapToInt() {List<String> list = new ArrayList<String>() {{add("1");add("2");add("3");}};list.stream().mapToInt(s->Integer.valueOf(s))// 一定要有 mapToObj,因为 mapToInt 返回的是 IntStream,因为已经确定是 int 类型了// 所有没有泛型的,而 Collectors.toList() 强制要求有泛型的流,所以需要使用 mapToObj// 方法返回有泛型的流.mapToObj(s->s).collect(Collectors.toList());list.stream().mapToDouble(s->Double.valueOf(s))// DoubleStream/IntStream 有许多 sum(求和)、min(求最小值)、max(求最大值)、average(求平均值)等方法.sum();}
Distinct
distinct 方法有去重的功能:
public void testDistinct(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("2");}};list.stream().map(s -> Integer.valueOf(s)).distinct().collect(Collectors.toList());}
Sorted
Sorted 方法提供了排序的功能,并且允许我们自定义排序。
public void testSorted(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("3");}};list.stream().map(s -> Integer.valueOf(s))// 等同于 .sorted(Comparator.naturalOrder()) 自然排序.sorted().collect(Collectors.toList());// 自定义排序器list.stream().map(s -> Integer.valueOf(s))// 反自然排序.sorted(Comparator.reverseOrder()).collect(Collectors.toList());}
groupingBy
groupingBy 是能够根据字段进行分组,toMap 是把 List 的数据格式转化成 Map 的格式。
public void testGroupBy(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("2");}};Map<String, List<String>> strList = list.stream().collect(Collectors.groupingBy(s -> {if("2".equals(s)) {return "2";}else {return "1";}}));}
FindFirst
findFirst 表示匹配到第一个满足条件的值就返回:
public void testFindFirst(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("2");}};list.stream().filter(s->"2".equals(s)).findFirst().get();// 防止空指针list.stream().filter(s->"2".equals(s)).findFirst()// orElse 表示如果 findFirst 返回 null 的话,就返回 orElse 里的内容.orElse("3");Optional<String> str= list.stream().filter(s->"2".equals(s)).findFirst();// isPresent 为 true 的话,表示 value != nullif(str.isPresent()){return;}}
Reduce
reduce 方法允许我们在循环里面叠加计算值:
public void testReduce(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("3");}};list.stream().map(s -> Integer.valueOf(s))// s1 和 s2 表示循环中的前后两个数.reduce((s1,s2) -> s1+s2).orElse(0);list.stream().map(s -> Integer.valueOf(s))// 第一个参数表示基数,会从 100 开始加.reduce(100,(s1,s2) -> s1+s2);}
Peek
peek 方法很简单,我们在 peek 方法里面做任意没有返回值的事情,比如打印日志:
public void testPeek(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("3");}};list.stream().map(s -> Integer.valueOf(s)).peek(s -> System.out.println(s)).collect(Collectors.toList());}
Limit
limit 方法会限制输出值个数,入参是限制的个数大小:
public void testLimit(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("3");}};list.stream().map(s -> Integer.valueOf(s)).limit(2L).collect(Collectors.toList());}
Max,Min
通过 max、min 方法,可以获取集合中最大、最小的对象。
public void testMaxMin(){List<String> list = new ArrayList<String>() {{add("1");add("2");add("2");}};list.stream().max(Comparator.comparing(s -> Integer.valueOf(s))).get();list.stream().min(Comparator.comparing(s -> Integer.valueOf(s))).get();}
java8新特性之Lambda流常用表达式的方法合集相关推荐
- 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>
需求分析: 有两个Long类型的集合 : List<Long> tagsIds; List<Long> attributesIds; 现在需要将这两个Long类型的集合进行组合 ...
- 【java8新特性】——lambda表达式与函数式接口详解(一)
一.简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式.函数式接口.方法引用.默认方法.新工具(编译工具).Stream API.Date Time ...
- Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- java8新特性之lambda表达式--超级详细版本
java8新特性之lambda表达式 1.什么是lambda表达式?为什么用它? 2. 为什么Java需要lambda表达式? 3. lambda表达式的语法 4.函数式接口 4.1 什么是函数式接口 ...
- java8新特性总结——lambda表达式
最近看尚硅谷java8新特性视屏,总结一下学习知识. Lambda表达式:是一个匿名函数,我们可以把Lambda理解为一段可以传递的代码(将代码像数据一样传递),可以写出更简洁更灵活的代码.作为一种更 ...
- 零基础学习java------21---------动态代理,java8新特性(lambda, stream,DateApi)
1. 动态代理 在一个方法前后加内容,最简单直观的方法就是直接在代码上加内容(如数据库中的事务),但这样写不够灵活,并且代码可维护性差,所以就需要引入动态代理 1.1 静态代理实现 在讲动态代理之前, ...
- java stream byte_乐字节-Java8新特性之Stream流(上)
上一篇文章,小乐给大家介绍了<Java8新特性之方法引用>,下面接下来小乐将会给大家介绍Java8新特性之Stream,称之为流,本篇文章为上半部分. 1.什么是流? Java Se中对于 ...
- Java8新特性之Lambda,呦呦呦
Java8新特征之Lambda Lambda表达式(也称为闭包),它允许我们将函数当成参数传递给某个方法,或者把代码本身当作数据处理.很多语言(Groovy.Scala等)从设计之初就支持Lambda ...
最新文章
- Java中date和calendar的用法
- java设计模式---构建者模式
- vue中监听input框获取焦点,失去焦点的问题
- 高通平台 MIC BIAS 的问题
- .net core将URL请求格式化为XML或JSON(网站动态生成sitemap.xml)
- 格式化的盘要怎么恢复数据
- .NET Core + Spring Cloud:API 网关
- 团队作业—预则立他山之石
- oracle 11g 卸载 客户端卸载
- python画十字_matplotlib绘制鼠标的十字光标的实现(内置方式)
- 本科论文房地产公司财务风险评价与控制研究
- Windows下删除文件夹提示找不到该项目,请确认该项目的位置,然后重试。
- 使用PowerShell管理Exchange Server 2016
- 看风水不如依照这些定律改造命运
- css 关于元素选中时会显示蓝色背景
- python处理word替换_python替换word中的关键文字(使用通配符)
- oracle avg() 绝对平均值
- 计算机5大的控件的功能,7款顶级功能插件,每一款都堪称办公宝典!
- CodeM 第二题 可乐
- hdu 3003-Pupu-快速幂取模
热门文章
- HTML5使用Geoloacation API检测浏览器的支持性
- 第一章 聚合函数概述
- Python重复值的处理
- 社群运营增长与变现第02讲:社群运营新思维模式:C-ACM-MT 模型,全链路思考
- android:layout_marginbottom,layout_marginBottom不能用的解决方法
- QQ 聊天机器人小薇 2.1.0 发布!
- 深拷贝与浅拷贝的那些事儿
- 【软件设计】软件设计到底是什么?
- vhdl八路抢答器简单程序_贵州抢答器plc程序编程图-云南尼邦商贸
- 太阳的光和灯光有什么区别_灯光和太阳光能量完全不同,亮度也相差巨大,速度会不同吗?...