Java8 Stream接口流式方法:map操作、filter操作以及flatMap操作
点击关注公众号,利用碎片时间学习
关于stream 流式操作,在rt.jar 包里面,ReferencePipeline管道方式操作数据 下面集成所有操作方法,利用这些流,处理大数据的方式,效率提升明显,并且很多语言都支持这种操作,相当于统一了这种编程方式。
我们先来看看这三个操作过滤的是什么数据,
过滤之后仍然可以循环数据
list.stream().filter(smap -> null != smap.get("ip") && !"".equals(smap.get("ip"))).forEach(imp -> {listipzone.add(wry.findIP(imp.get("ip").toString()));
});
1,filter操作,我们先看方法的定义
源码如下Stream<T> filter(Predicate<? super T> predicate);
一个单纯的过滤操作直接返回传入类型
String[] dd = { "a", "b", "c" };Stream<String> stream = Arrays.stream(dd);stream.filter(str -> str.equals("a")).forEach(System.out::println);//返回字符串为a的值
2.map操作,先看方法定义
源码如下 <R> Stream<R> map(Function<? super T, ? extends R> mapper);
这个方法传入一个Function的函数式接口,这个接口,接收一个泛型T,返回泛型R,map函数的定义,返回的流,表示的泛型是R对象,这个表示,调用这个函数后,可以改变返回的类型
public static void main(String[] args) {Integer[] dd = { 1, 2, 3 };Stream<Integer> stream = Arrays.stream(dd);stream.map(str -> Integer.toString(str)).forEach(str -> {System.out.println(str);// 1 ,2 ,3System.out.println(str.getClass());// class java.lang.String});List<Emp> list = Arrays.asList(new Emp("a"), new Emp("b"), new Emp("c"));list.stream().map(emp -> emp.getName()).forEach(str -> {System.out.println(str);});}public static class Emp {private String name;public Emp() {super();}public Emp(String name) {super();this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}
可以看到,我们把Integer,变成了String输出,把Emp对象里的name字符串,单独输出;现在,我们只看到了一个forEach的终端操作,后面,我们会看到,更多的终端操作,把map操作后,改变的对象类型,返回各种类型的集合,或者对数字类型的,返回求和,最大,最小等的操作;
3.flatMap操作,我们还是先看接口定义
包含前面两种过滤类型
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
这个接口,跟map一样,接收一个Fucntion的函数式接口,不同的是,Function接收的泛型参数,第二个参数是一个Stream流;方法,返回的也是泛型R,具体的作用是把两个流,变成一个流返回,下面,我们看一个案例,来详细解答,怎么把两个流的内容,变成一个流的内容
public static void main(String[] args) {String[] strs = { "aaa", "bbb", "ccc" };Arrays.stream(strs).map(str -> str.split("")).forEach(System.out::println);// Ljava.lang.String;@53d8d10aArrays.stream(strs).map(str -> str.split("")).flatMap(Arrays::stream).forEach(System.out::println);// aaabbbcccArrays.stream(strs).map(str -> str.split("")).flatMap(str -> Arrays.stream(str)).forEach(System.out::println);// aaabbbccc}
首先,第二段代码,才输出的具体的字符串;
第一段输出代码里,我们先看map操作,通过上面对map的介绍,我们可以看到,map可以改变返回的Stream的泛型,str.split(""),根据空字符串分隔,返回的类型是一个数组,返回的流也是Stream<String[]>
,而不是Stream<String>;
在第二段代码中,数组的流,经过map操作,返回Stream<String[]>
后,再经过flatMap,把数组通过Arrays.stream
变成一个新的流,再返回到原来的流里;这样,两个流就合并成一个流;第三段代码,是第二段代码的,另一种写法;
PS 简单操作示例 1filter 过滤,2 map可以返回其它类型,3 flatMap合并两个流数据
String[] includes=new String[10];includeList.toArray(includes);List<String> maplist = includeList.stream().map(s -> s.equals("a6")?"a6L":s).collect(Collectors.toList());List<String> filterlist = includeList.stream().filter(s -> s.equals("a6")).collect(Collectors.toList());includeList.stream().map(s -> s.equals("a6")?"a6L":s).forEach(System.out::println);//直接操作里面的数据, 改变逻辑后可以返回list等filterlist.forEach(System.out::println);// 只打印a6过滤的数据maplist.forEach(System.out::println);
4 构造流的几种常见方法
Stream stream = Stream.of("a", "b", "c");// 2. ArraysString [] strArray = new String[] {"a", "b", "c"};stream = Stream.of(strArray);stream = Arrays.stream(strArray);// 3. CollectionsList<String> list = Arrays.asList(strArray);stream = list.stream();// map对象进行 排序对比,最主要还是要把数字转化为 Integer类型去比较,否则只是字符串比较,无意义,封装成一个可比较的数据类型,转化字符串为数字类型 就可能排序了model.put("data", listMap.stream().sorted((a, b) -> Integer.valueOf(b.get("count").toString()).compareTo(Integer.valueOf(a.get("count").toString())))
5 流转换为其它数据结构
// 1. Array
String[] strArray1 = stream.toArray(String[]::new);
// 2. Collection
List<String> list1 = stream.collect(Collectors.toList());
List<String> list2 = stream.collect(Collectors.toCollection(ArrayList::new));
Set set1 = stream.collect(Collectors.toSet());
Stack stack1 = stream.collect(Collectors.toCollection(Stack::new));
// 3. String
String str = stream.collect(Collectors.joining()).toString();
//分组构造Map
Map<Integer, String> factoryMap = factoryConfigDOS.stream().collect( Collectors.groupingBy(AgencyDailySalaryFactoryConfigDO::getFenceId, Collectors.mapping(AgencyDailySalaryFactoryConfigDO::getFactoryName, joining(",")) ));//Map转化 函数表达式转成MAP,key1和key2重复就覆盖不然会报错
Map nameMap = incumbentExcelInfoList.stream().collect(Collectors.toMap(info -> info.getIdCard(), info -> info.getName(),(key1,key2)->key2));
一个 Stream 只可以使用一次
很多API都有这种方式的操作,对后期大数据或者其它语言兼容,解决跨语言的问题,也提交了效率,日后要以这种方式处理数据,
6 流的操作
接下来,当把一个数据结构包装成 Stream 后,就要开始对里面的元素进行各类操作了。常见的操作可以归类如下。
Intermediate: (中间)
map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unorderedTerminal:(终端)
forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iteratorShort-circuiting:(短路)
anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limi
limit/skip
limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素(它是由一个叫 subStream 的方法改名而来)。
List<String> personList2 = persons.stream().
map(Person::getName).limit(10).skip(3).collect(Collectors.toList());System.out.println(personList2);
所有 Stream 的操作必须以 lambda 表达式为参数
merge为Map接口新增的默认方法
// k-8值存在为value8->执行merge函数->直接返回"NewMerge8"->newValue为"NewMerge8"
// 执行put->所以这里输出"NewMerge8"
map.merge(8, "merge", (value, newValue) -> "NewMerge8");
System.out.println(map.get(8));// 合并方式
String newValue2 = map.merge(9, "concat", (value, newValue) -> value.concat(newValue));// 解释:从字符串序列中过滤出以字符a开头的字符串并迭代打印输出
stringList.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);
组合查询 主要是peek 监视消费后执行的动作
List<Integer> nums = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
System.out.println(“sum is:”+nums.stream().filter(num -> num != null).distinct().mapToInt(num -> num * 2).peek(System.out::println).skip(2).limit(4).sum());
Integer类型的List,获取其对应的Stream对象,然后进行过滤掉null,再去重,再每个元素乘以2,再每个元素被消费的时候打印自身,在跳过前两个元素,最后去前四个元素进行加和运算
7 数据并行化操作
Stream 的并行化也是 Java 8 的一大亮点。数据并行化是指将数据分成块,为每块数据分配单独的处理单元。这样可以充分利用多核 CPU 的优势。
并行化操作流只需改变一个方法调用。如果已经有一个 Stream 对象,调用它的 parallel()
方法就能让其拥有并行操作的能力。如果想从一个集合类创建一个流,调用 parallelStream()
就能立即获得一个拥有并行能力的流。
int sumSize = Stream.of("Apple", "Banana", "Orange", "Pear") .parallel() .map(s -> s.length()) .reduce(Integer::sum) .get(); assertEquals(sumSize, 21);
详情API参考
https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/
来源:blog.csdn.net/limingcai168/article/details/85265089
推荐:
主流Java进阶技术(学习资料分享)
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
Java8 Stream接口流式方法:map操作、filter操作以及flatMap操作相关推荐
- java8 lambda maplist排序_「java8系列」流式编程Stream
前言 「Java8系列」神秘的Lambda 「Java8系列」神奇的函数式接口 继上两篇之后,本文已经java8系列的第三篇了.本篇文章比较长,但我希望大家都能认真读完.读不完可以先收藏,在找时间读. ...
- java8新特新:接口流-Stream()接口和所有方法(map,foreach,filter,count,distinct,limit,collect,skip,sorted)
Steam<T> 接口流 类型参数: T - 流元素的类型 所有超级接口: AutoCloseable,BaseStream <T,Stream <T >> 公共接 ...
- Java8 Stream 中的 reduce() 方法,执行聚合操作
初识 Stream 中的 reduce() 方法,是在最近一次刷算法题的过程中(下面会讲到),简洁干练的写法,让我眼前一亮. 所以,我简单学习了,总结了一下写法: 正文 Java 8 API添加了一个 ...
- java8 stream 分组_Java 8 中 Map 骚操作之 merge() 的用法
作者:LQ木头来源:http://juejin.im/post/5d9b455ae51d45782b0c1bfb Java 8 最大的特性无异于更多地面向函数,比如引入了 lambda等,可以更好地进 ...
- java 流式_Java开发笔记(七十二)Java8新增的流式处理
通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...
- java8 —— Stream( 流 )
文章目录 一.Stream( 流 )是什么? 二.Stream 的操作三个步骤 三.创建Stream 四.Stream 的中间操作 4.1.筛选与切片 4.2. 映射:(重点) 4.3. 排序: 五. ...
- 增强 Stream 接口的 distinct 方法的一些思考
遇到的问题 Java 8 开始引入了 Stream, 其中的 api 一直在不断的优化更新完善,Java 9 中更是引入了 ofNullable 还有 takeWhile 和 dropWhile 这两 ...
- Java8 Stream生成流 generate iterate IntStream
目录 一.Stream.generate() 1.1 生成实体类对象List 1.2 生成5个0到指定范围内的随机整数 1.3 生成指定5个范围内的随机整数 1.4 生成5个随机三位数 二.Strea ...
- 读自动驾驶激光雷达物体检测技术(Lidar Obstacle Detection)(1):Stream PCD流式载入激光点云数据
首先贴一下大佬的github链接:https://github.com/williamhyin/SFND_Lidar_Obstacle_Detection 知乎专栏:https://www.zhihu ...
最新文章
- 何不用python_EXCEL数据太“脏”无从下手?何须用python,ETL一分钟搞定
- pythonfor循环加2_python-for循环
- centos 8 rpm yum install_关于yum不能正常使用的解决方案
- 行业牛人和开源软件改变技术世界
- php 打印行数,php/html-按行和列配置钻石数量的打印格式
- 从网络获取数据显示到TableViewCell容易犯的错
- js当中null和{}区别
- 系统类配置(六) ubuntu16.04命令行安装Nvidia显卡驱动(操作指令详细注释版)
- hdoj2955 Robberies(01背包)
- 2.4.5 数据框(data frame)的建立
- 轻松解决加密的PDF如何编辑简单技巧
- 网络知识之----http七层协议
- 陈坤发微博调侃 回应儿子生母话题
- 转速传感器隔离放大器输出信号隔离变送器正弦波转方波信号隔离器
- python qq群发消息_Python版QQ群发消息
- java线程栅栏_java多线程 栅栏CyclicBarrier
- 爬虫爬取知乎评论并利用flask框架做简单的可视化
- 隐藏win10资源管理器中显示的「DVD驱动器」
- Kerberos基础及KDC服务(理论知识)
- 【Luogu P1151】子数整数
热门文章
- 数据安全之MySQL数据加解密的实现方案
- poi导出excel中响应头文件名乱码
- JavaScript权威指南7(四) 第十一章 JavaScript 标准库
- 用freemarker生成word文档,并插入图片
- 项目管理过程之进度控制
- elasticsearch7.1.1入门之集群的基础配置
- 微信公众号创建菜单报错40016
- Log4j2漏洞发展历程及解决方案
- [CodeForces]CodeForces - 1025F Disjoint Triangles
- 2022-2028年全球与中国屏幕指纹传感器行业发展趋势及投资战略分析