java 8 stream api 中有两个方法map和flatMap非常实用,应用场景也非常广泛,能极大提升编程效率。下面我们详细介绍一下这两个方法的用法。

map方法

我们来看个示例:把一个整数列表转换成字符串列表,java 8之前常用的实现方法如下

List numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

List strList = new ArrayList<>();

for (int num : numList) {

strList.add(Integer.toString(num));

}

这种写法比较符合直觉,但略显繁琐。如果用java 8的stream api的map方法则可以把这个过程变的非常简洁

List strList = numList.stream()

.map(it -> Integer.toString(it))

.collect(Collectors.toList());

map方法接受一个lambda表达式,这个表达式是一个函数,输入类型是集合元素的类型,输出类型是任意类型

it -> Integer.toString(it)

在示例中就是将集合中的整数元素逐个转换成字符串类型。这种写法和常规的编程思路不同,却有点像SQL

select id from table1

这条SQL语句读取一张表的id字段,id是int类型,我们将他转换成字符类型,实现方法如下

select cast(id as CHAR(10)) as id from table1

SQL中的select对应的是map方法

cast(id as CHAR(10)) 对应的就是 it -> Integer.toString(it)

我们还可以用map实现很多效果,比如转换成符合要求的bool列表

List boolList = numList.stream()

.map(it -> it > 5 ? true : false)

.collect(Collectors.toList());

或者转换成某种对象列表

public class Main {

private static class Klass {

private int field;

public Klass(int field) {

this.field = field;

}

@Override

public String toString() {

return "field=" + field;

}

}

public static void main(String[] args) {

List numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

List objList = numList.stream()

.map(it -> new Klass(it))

.collect(Collectors.toList());

}

}

都可以非常迅速的实现,和那些流水账式的代码告别

List objList2 = new ArrayList<>();

for (int num : numList) {

objList2.add(new Klass(num));

}

其实这种写法就是函数式编程的声明性编程,将代码写成表达式类型。而我们常用的SQL语言天生就是函数式语言。

flatMap方法

我们把需求扩展下

先定义两个类型

private static class Klass {

private int field;

public Klass(int field) {

this.field = field;

}

@Override

public String toString() {

return "field=" + field;

}

}

private static class KlassGroup {

private List group = new ArrayList<>();

public KlassGroup(Klass... objList) {

for (Klass item : objList) {

this.group.add(item);

}

}

public List getKlassList() {

return group;

}

}

KlassGroup类中定义了一个Klass类的列表

现在我们有一组KlassGroup对象

List groupList = Arrays.asList(

new KlassGroup(new Klass(1), new Klass(2), new Klass(3)),

new KlassGroup(new Klass(4), new Klass(5), new Klass(6)),

new KlassGroup(new Klass(7), new Klass(8), new Klass(9)),

new KlassGroup(new Klass(10))

);

需要将每个KlassGroup对象中的那些Klass类取出来,放到一个ArrayList里面,得到一个List。我们尝试着用map方法来实现

List> result = groupList.stream()

.map(it -> it.getKlassList())

.collect(Collectors.toList());

哈,不成功,我们想要的结果是List,现在得到了 List>。当然,我们可以轻而易举的解决这个问题

List result2 = new ArrayList<>();

for (KlassGroup group : groupList) {

for (Klass klass : group.getKlassList()) {

result2.add(klass);

}

}

但是这种套了两层for循环的代码太丑陋了。面对这种需求,flatMap可以大展身手了

List result3 = groupList.stream()

.flatMap(it -> it.getKlassList().stream())

.collect(Collectors.toList());

一行代码就实现了

stream api 的 flatMap方法接受一个lambda表达式函数, 函数的返回值必须也是一个stream类型,flatMap方法最终会把所有返回的stream合并,map方法做不到这一点,如果用map去实现,会变成这样一个东西

List> result3 = groupList.stream()

.map(it -> it.getKlassList().stream())

.collect(Collectors.toList());

flatMap的思路在其他语言中也有体现,比如C# Linq中的 SelectMany 方法,F# 中的 List.collect方法都有同样的作用。用函数式编程的说法,他们都实现了 monad,当然,monad这个概念很难是通俗的描述清楚,此文中就不展开了。

java 8 stream api 中各方法可以极大的简化集合操作,带来大幅度的编码效率提升,如果是java 8及以上的版本,一定要优先使用,stream api绝对是java中史诗级的工作效率提升利器。

java flatmap_Java 8 Steam API map和flatMap方法使用详解相关推荐

  1. java steam说明_Java 8 Steam API map和flatMap方法使用详解

    一对多的提取内容用flatmap,一对一用map java 8 stream api 中有两个方法map和flatMap非常实用,应用场景也非常广泛,能极大提升编程效率.下面我们详细介绍一下这两个方法 ...

  2. Java 8 Steam API map和flatMap方法使用详解

    java 8 stream api 中有两个方法map和flatMap非常实用,应用场景也非常广泛,能极大提升编程效率.下面我们详细介绍一下这两个方法的用法. map方法 我们来看个示例:把一个整数列 ...

  3. Java的JVM运行时栈结构和方法调用详解

    详细介绍了Java 的JVM的运行时栈结构,以及和方法调用详解,包括解析调用和分派调用. JVM对于方法的执行是基于栈的,方法调用--入栈,方法调用完毕--出栈,了解JVM的运行时栈结构,有助于我们更 ...

  4. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

    文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...

  5. java lambda表达式 steam api

    java lambda表达式 steam api 案例使用 java版本为 jdk-17 foreach 遍历 public class JavaDemo03 {public static void ...

  6. Java基础之Java8中map和flatMap的使用

    Java基础之Java8中map和flatMap的使用 一.介绍 首先,看下map和flatMap的官方文档说明 map flatMap 其实单纯的看api说明还是比较抽象,下面我将以几个实战例子来帮 ...

  7. java flatmapfunction_Java Stream中map和flatMap方法

    最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别. 虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里. 通过演示Demo中 ...

  8. stream map方法_Java Stream中map和flatMap方法

    最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别. 虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里. 通过演示Demo中 ...

  9. Java 中调用 Apache API 实现图片文件的 压缩 与 解压 实例

    < Java 中调用 Apache API 实现图片文件的 压缩 与 解压 > 为什么不直接使用 Java JDK 中自带的 API 呢?必须使用 Apache API 实现文件的压缩与解 ...

最新文章

  1. solr 函数使用之map
  2. select2的一些特性效果
  3. 自定义手势解锁锁控件
  4. 多线程原来是这么简单
  5. redis -memcahe-mongo资料-windows定时重启计划
  6. SAP ABAP gateway调用后台系统时选择RFC的决定逻辑
  7. 大根堆的删除c语言,大根堆和小根堆的C语言实现
  8. JAVA基础——时间Date类型转换
  9. this关键字 和 private关键字
  10. Python常用画图代码(折线图、柱状图、饼图)
  11. java excel导入_一场关于Java.lang.String类的极限调优操作
  12. PHP开源管理系统 Gms,GMS 一个成熟的gms系统,拥有基本的权限管理和分类,后台很好 Windows Develop 249万源代码下载- www.pudn.com...
  13. Android 缩放动画 ScaleAnimation
  14. SRE从踩坑到牛逼(二)利用Python进行Arcgis站点分析+Nginx日志分析
  15. vue文件如何引入icon图标并使用
  16. 正本清源:为什么区块链是一次新的信息化革命
  17. 用Python实现火爆全网的「蚂蚁呀嘿」!这也太恶搞了吧!
  18. 区块链革命来临,这些事儿你必须知道
  19. 【办公类-19-02】办公中的思考——Python批量制作word文本框的名字小标签,用A4word打印(植物角、家长会、值日生)
  20. connection and session

热门文章

  1. 35岁学嵌入式合适吗_什么是嵌入式技术?
  2. 二元函数洛必达求极限_洛必达法则的几个例子
  3. 关于 m1 xcode12 编译报错 this target. for architecture arm64等问题解决方案
  4. 使用foreach循环遍历Collection集合
  5. java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
  6. python 字符串unicode编码_python的string与Unicode转换,gbk字符串编码
  7. 系统建模、分析、仿真和验证软件工具ModelCodoer
  8. 如何对一个变量数据进行正则判定_生存分析数据中的BuckleyJamesMultipleRegression Model...
  9. 高中必背88个数学公式_高中数学:必修+选修全部知识点精华!附高考必背203个公式...
  10. 此计算机到未能识别网络连接,本地连接显示“未识别的网络”