lambda表达式——Stream管道流的map操作

  • 一、回顾Stream管道流map的基础用法
  • 二、处理非字符串类型集合元素
  • 三、再复杂一点:处理对象数据格式转换
  • 四、flatMap

一、回顾Stream管道流map的基础用法

最简单的需求:将集合中的每一个字符串,全部转换成大写!

List<String> alpha = Arrays.asList("Monkey", "Lion", "Giraffe", "Lemur");//不使用Stream管道流
List<String> alphaUpper = new ArrayList<>();
for (String s : alpha) {alphaUpper.add(s.toUpperCase());
}
System.out.println(alphaUpper); //[MONKEY, LION, GIRAFFE, LEMUR]// 使用Stream管道流
List<String> collect = alpha.stream().map(String::toUpperCase).collect(Collectors.toList());
//上面使用了方法引用,和下面的lambda表达式语法效果是一样的
//List<String> collect = alpha.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());System.out.println(collect); //[MONKEY, LION, GIRAFFE, LEMUR]

所以map函数的作用就是针对管道流中的每一个数据元素进行转换操作。

二、处理非字符串类型集合元素

map()函数不仅可以处理数据,还可以转换数据的类型。如下:

List<Integer> lengths = alpha.stream().map(String::length).collect(Collectors.toList());System.out.println(lengths); //[6, 4, 7, 5]
Stream.of("Monkey", "Lion", "Giraffe", "Lemur").mapToInt(String::length).forEach(System.out::println);

输出如下:

6
4
7
5

除了mapToInt。还有maoToLong,mapToDouble等等用法

三、再复杂一点:处理对象数据格式转换

还是使用上一节中的Employee类,创建10个对象。需求如下:

  • 将每一个Employee的年龄增加一岁
  • 将性别中的“M”换成“male”,F换成Female。
public static void main(String[] args){Employee e1 = new Employee(1,23,"M","Rick","Beethovan");Employee e2 = new Employee(2,13,"F","Martina","Hengis");Employee e3 = new Employee(3,43,"M","Ricky","Martin");Employee e4 = new Employee(4,26,"M","Jon","Lowman");Employee e5 = new Employee(5,19,"F","Cristine","Maria");Employee e6 = new Employee(6,15,"M","David","Feezor");Employee e7 = new Employee(7,68,"F","Melissa","Roy");Employee e8 = new Employee(8,79,"M","Alex","Gussin");Employee e9 = new Employee(9,15,"F","Neetu","Singh");Employee e10 = new Employee(10,45,"M","Naveen","Jain");List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);/*List<Employee> maped = employees.stream().map(e -> {e.setAge(e.getAge() + 1);e.setGender(e.getGender().equals("M")?"male":"female");return e;}).collect(Collectors.toList());*/List<Employee> maped = employees.stream().peek(e -> {e.setAge(e.getAge() + 1);e.setGender(e.getGender().equals("M")?"male":"female");}).collect(Collectors.toList());System.out.println(maped);}

由于map的参数e就是返回值,所以可以用peek函数。peek函数是一种特殊的map函数,当函数没有返回值或者参数就是返回值的时候可以使用peek函数。

四、flatMap

map可以对管道流中的数据进行转换操作,但是如果管道中还有管道该如何处理?即:如何处理二维数组及二维集合类。实现一个简单的需求:将“hello”,“world”两个字符串组成的集合,元素的每一个字母打印出来。如果不用Stream我们怎么写?写2层for循环,第一层遍历字符串,并且将字符串拆分成char数组,第二层for循环遍历char数组。

List<String> words = Arrays.asList("hello", "word");
words.stream().map(w -> Arrays.stream(w.split("")))    //[[h,e,l,l,o],[w,o,r,l,d]].forEach(System.out::println);

输出打印结果:

java.util.stream.ReferencePipeline$Head@3551a94
java.util.stream.ReferencePipeline$Head@531be3c5
  • 用map方法是做不到的,这个需求用map方法无法实现。map只能针对一维数组进行操作,数组里面还有数组,管道里面还有管道,它是处理不了每一个元素的。

  • flatMap可以理解为将若干个子管道中的数据全都,平面展开到父管道中进行处理。

words.stream().flatMap(w -> Arrays.stream(w.split(""))) // [h,e,l,l,o,w,o,r,l,d].forEach(System.out::println);

输出打印结果:

h
e
l
l
o
w
o
r
d

lambda表达式——Stream管道流的map操作相关推荐

  1. java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作

    一.回顾Stream管道流map的基础用法 最简单的需求:将集合中的每一个字符串,全部转换成大写! List<String> alpha = Arrays.asList("Mon ...

  2. Lambda表达式和Stram流组合一个高效用法(遍历集合)

    Lambda表达式和Stram流组合在遍历循环对象的时候的高效用法 People类 public class People {private String id;private String name ...

  3. java 管道流的读写操作 用于两个线程之间的通信

    /* java 管道流的读写操作 用于两个线程之间    PipedOutputStream    PipedInputStream  连接起来就是一个管道     管道输出流可以向管道写入数据   ...

  4. 第四章 函数式编程(Lambda表达式Stream流)

    一.Lambda表达式 特点:是匿名函数 2是可传递 匿名函数:需要一个函数,但又不想命名一个函数的场景下使用lambda表达式,使用lambda表达式时函数内容应该简单 可传递:将lambda表达式 ...

  5. JDK1.8新特性之Lambda表达式+Stream流+函数式接口

    一.Lambda表达式 Lambda表达式,是JDK1.8引入的一种语法,这种语法可以对匿名内部类的写法,进行简写. 1.快速入门 package org.westos.demo2;import ja ...

  6. java8学习之Lambda表达式深入与流初步

    Lambda表达式深入: 在上一次[http://www.cnblogs.com/webor2006/p/8135873.html]中介绍Lambda表达式的作用时,其中说到这点: 如标红处所说,既然 ...

  7. Lambda 表达式详解~Streams API~规约操作

    上一节介绍了部分Stream常见接口方法,理解起来并不困难,但Stream的用法不止于此,本节我们将仍然以Stream为例,介绍流的规约操作. 规约操作(reduction operation)又被称 ...

  8. lambda表达式可以用来声明_Lambda 的骚操作,你都get到了没

    点击上方关注,选择设为星标每天分享优质干货 Lambda简介 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中 ...

  9. Java 8 Lambda 表达式Stream操作

    在jdk1.8新的stream包中针对集合的操作也提供了并行操作流和串行操作流.并行流就是把内容切割成多个数据块,并且使用多个线程分别处理每个数据块的内容. 优点: Stream API可以极大提高J ...

最新文章

  1. Linux_SystemLogManager
  2. web项目部署到linux服务器出现的问题
  3. Oracle 共享磁盘阵列 双机热备 实战 配置教程 配置手册
  4. https://zeplin.io/ 设计图标注及切图
  5. 满二叉树及完全二叉树的相关性质证明
  6. Nginx——安装详解
  7. 20180908 2018-2019-2 《密码与安全新技术专题》第3周作业
  8. pycharm显示全部数据_必备 | 提升效率的数据分析工具,吴恩达都在用
  9. 帧大小超过交换机mtu_三层交换机与路由器区别在哪里?
  10. matlab中的tall,tall 数组 - MATLAB Simulink - MathWorks 中国
  11. PHP中的数组(数据结构)
  12. MySQL-存储过程-高效清理数据
  13. 智能优化及其相关算法
  14. Abp(.NetCore)开发与发布过程3-部署Ubuntu站点
  15. Unity应该怎样学习
  16. 贪心算法《活动时间安排问题》
  17. 2022金三银四面试总结-Java高级篇
  18. TutorialsPoint NumPy 教程
  19. P1024 [NOIP2001 提高组] 一元三次方程求解 /1238:一元三次方程求解
  20. 自动备份android,Android自动备份错误

热门文章

  1. R语言初探之存储模型/报童问题
  2. 使用AI制作 3d 模型初学者指南,如何在 Blender 3d 中使用stable diffusion
  3. 计算机名有重名,导致的问题
  4. 疫情在家,全球 3万个景区 VR全景图,免费看。
  5. 今天通过了 AWS 的 SAA 认证考试了
  6. 为什么有时ping不通www.baidu.com但可以访问www.baidu.com网页?
  7. 西电通院随机信号实验(FPGA实现2ASK键控、RC低通滤波器、Matlab实现SSB调制)
  8. 模式识别技术漫谈(2)
  9. Oracle与SQL *PLUS简介
  10. element中设置5栏布局