Optional和Stream的map与flatMap
Optional的map和flatMap
Optional存在map和flatMap方法。map源码如下
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
map方法和Stream的map方法类似,都是对变量进行映射转换。
Optional.flatMap源码如下:
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Objects.requireNonNull(mapper.apply(value));
}
}
从源码看,map和flatMap均要求optional对象非空才执行mapper方法,二者均返回Optional对象。但是map会自动将计算结果封装为Optional对象,而flatMap需要自己进行封装。
Stream的map和flatMap
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
map方法好说,是一个很简单的Function方法,输入参数类型?super T,输出参数类型为? extends R,是一种一对一的关系。将一个流映射成另外一个流。
假设需要将list的每个字符串都映射成为大写,
List<String> list = Arrays.asList("hello world","hello world");
list.stream().map(String::toUpperCase).forEach(s -> System.out.print(s+"8 "));
//HELLO WORLD8 HELLO WORLD8
若现在需求变了,需要将list的每个字符串按照“ ”分割,分别处理每个单词(list共4个单词)。这里我们仍然使用map进行测试。
list.stream().map(s -> Stream.of(s.split(" "))).map(String::toUpperCase).forEach();
该代码存在语法错误,第二个map提示所需参数为Function<? super Stream, ? extend R> mapper。这说明第一个map产生了多个流(hello流和world流),这个时候就需要使用到flatMap了。jdk8对flatMap的解释为
Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element.
意思很明确,流的每个元素都会产生一个新的流。这多个流会合并为一个流,作为flatMap的返回结果。
list.stream().flatMap(s -> Stream.of(s.split(" "))).map(String::toUpperCase).forEach(s -> System.out.println(s+"9 "));
//output:HELLO9 WORLD9 HELLO9 WORLD9
Optional和Stream的map与flatMap的更多相关文章
- java8中stream的map和flatmap的理解
转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...
- [java]Stream API——map和flatMap的区别
map方法 map的含义为映射.是指对于Stream中包含的每一个元素使用给定的转换函数进行转换. map传入的Lambda表达式必须是Function实例,参数可以为任意类型,而其返回值也是任性类型 ...
- Stream之filter、distinct、skip、map、flatMap、match、find、reduce
一.Stream之filter.distinct.skip: package com.cy.java8; import java.util.Arrays; import java.util.List; ...
- Swift 烧脑体操(四) - map 和 flatMap
前言 Swift 其实比 Objective-C 复杂很多,相对于出生于上世纪 80 年代的 Objective-C 来说,Swift 融入了大量新特性.这也使得我们学习掌握这门语言变得相对来说更加困 ...
- map和flatmap的区别+理解、学习与使用 Java 中的 Optional
转自:map和flatmap的区别 对于stream, 两者的输入都是stream的每一个元素,map的输出对应一个元素,必然是一个元素(null也是要返回),flatmap是0或者多个元素(为n ...
- java8中optional和.stream().map()
使用optional的好处:是一个可以包含或不可以包含非空值的容器对象,更加友好的处理程序中的空对象. Optional<T>有方法 isPresent() 和 get() 是用来检查其包 ...
- [RxJS] map vs flatMap
What's the difference between map and flatmap? First, let's show what map is. To show that, I need a ...
- Swift中的map 和 flatMap 原理及用法
之前对这两个概念有点糊,今天正好遇到一个相关需求,才深入了解了下. 需求如下: 大概就是对一个数组的model,重构成一个新model,返回得到一个新数组 用map很容易实现,不过后来我需要对其中进行 ...
- 利用stream对map集合进行过滤
最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯.一次无意的点到了公司封装的对map集合过滤的方法,发现了stream.于是研究了一下.并对原有的代码再次结合Optional进行重构下 ...
随机推荐
- pdf.js跨域加载文件
pdf.js一个基于Html的工具类,熟悉pdf.js的朋友们很清楚,pdf.js帮助我们做了很多事.尤其金融类网站会产生很多的报表.需要在线预览.pdf.js绝对是我们的首选 本地预览 在pdf.j ...
- Java-Servlet请求方式doXXX、service 具体分析
说起Servlet的接收处理请求的方式,想必各位都并不陌生,如doGet.doPost.service... 那么他们的背后是如何执行?服务器怎么选择知道的?我们就此来探讨一下 本节案例的代码奉上: ...
- 原生js实现分页功能
原生就是实现分页功能 代码如下: var pagination = function(option,fun){ this.parentId = option.id; //容器 this.pageSiz ...
- 在linux中用同一个版本的R 同时安装 Seurat2 和 Seurat3
在linux中用同一个版本的R 同时安装 Seurat 2 和 Seurat 3 Seurat 作为单细胞分析中的重量级R包,有多好用用,用过的人都知道.Seurat 分析流程基本涵盖了单细胞分析中 ...
- rwcheck:为嵌入式设备设计的读写压测工具
我设计的一款读写压测工具,开源在我的github仓库 rwcheck是一个对嵌入式设备进行读写压测的工具 什么是rwcheck 正如其名,rwcheck工具用于读写压测.它是什么工作原理呢?为什么要用 ...
- python+appium自动化测试(一)-----环境搭建
基础背景: windows7系统 +python3.4版本 环境搭建目标: 使用python编写app自动化测试脚本并成功执行. 搭建步骤: 1.安装python3,安装步骤详见:https:// ...
- 写论文的第二天 Hbase集群搭建
日志______2019.1.24 Hbase分布式搭建 注意:hbase的使用基于hadoop,开启以及关闭需要注意顺序,由于我是的是自带的zookeeper,说以开启关闭顺序应如下 启动:hado ...
- Net微信网页开发之使用微信JS-SDK获取当前地理位置
前言: 前段时间有一个关于通过获取用户当前经纬度坐标,计算出该用户距离某指定地点之间的距离.因为做这个项目需要能够获取到比较精确的经纬度坐标,刚开始使用的是百度地图结果发现百度地图地位不太准确(有时候 ...
- Oracle笔记_查询
1 单条件查询 select -- from -- where 条件 -- = > >= < <= != <> -- 单引号用于数据表示字符串 -- 双引号用于数据 ...
- nanopi NEO2 学习笔记 3:python 安装 RPi.GPIO
如果我要用python控制NEO2的各种引脚,i2c 或 spi ,RPi.GPIO模块是个非常好的选择 这个第三方模块是来自树莓派的,好像友善之臂的工程师稍作修改移植到了NEO2上,就放在 /roo ...