java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作
一、回顾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
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
java stream流_恕我直言你可能真的不会java第4篇:Stream管道流Map操作相关推荐
- java lambda表达式_恕我直言你可能真的不会java第1篇:lambda表达式会用了么?
本文配套教学视频:B站观看地址 在本号之前写过的一些文章中,笔者使用了lambda表达式语法,一些读者反映说代码看不懂.本以为java 13都已经出了,java 8中最重要特性lambda表达式大家应 ...
- java 与sql设置排序方法是_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合...
在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee { private Inte ...
- list按照某个字段排序_恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合
在开始之前,我先卖个关子提一个问题:我们现在有一个Employee员工类. @Data @AllArgsConstructor public class Employee {private Integ ...
- java transient关键字_嗯?你真的会用 Java 序列化机制?
码农每日一题长按关注,工作日每天分享一个技术知识点. 一.序列化.反序列化概念及其使用场景 1.序列化.反序列化的概念 简单的讲,序列化就是将java对象转化成二进制保存到磁盘中去,反序列化就是从磁盘 ...
- java byte char io流_一文带你看懂JAVA IO流,史上最全面的IO教学
原标题:一文带你看懂JAVA IO流,史上最全面的IO教学 一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符 ...
- javaio流_一文带你看懂JAVA IO流,史上最全面的IO教学啦
一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操 ...
- 牛客网 java刷题_牛客网刷题(纯java题型 1~30题)
应该是先extend,然后implement class test extends A implements B { public static void main(String[] args) { ...
- java框架核心技术_你必须掌握的 21 个 Java 核心技术!(干货)
点击上方"java进阶架构师",选择右上角"置顶公众号" 20大进阶架构专题每日送达 51闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘 ...
- java转换为c#_将25k行C#转换为Java的经验教训
java转换为c# 由于各种原因,我最近完成了一个将复杂的财务应用程序从C#转换为Java的项目. 港口的原因大部分是非技术性的,而是对相关企业的一项战略举措. 这是一次有趣的经历,我在此过程中吸取了 ...
最新文章
- HTML5培训教程:HTML5基础介绍
- 完美解决MySQL重装问题
- RESTful API 中的 Status code 是否要遵守规范
- [Abp vNext 源码分析] - 2. 模块系统的变化
- leetcode题解162-寻找峰值
- python 删除set指定值_python中的变量和数据类型(三)
- 利率模型暗示美国股市是合理价值(仅做参考)
- 怎样查看计算机注册表上的游戏,win7 32位旗舰版电脑中如何通过注册表修复游戏登陆问题...
- 核心游戏系统架构设计
- 日期转换 NSDate 格式 格林尼治时间 时差
- wim工具扫描linux磁盘,install.wim怎么提取 install.wim文件在哪里
- 小甲鱼Python3学习笔记之第十讲(仅记录学习)
- Gephi实战教程:从入门到精通
- More Joel on Software 读书笔记
- 网络打印机计算机服务,打印机服务器与网络打印机的安装
- 【TeXstudio】【7】段落,编号与自定义编号——《LaTeX入门》
- java与javax有什么区别?
- 阿里校园招聘2017编程题
- 1.1.8 怎样在Word的页眉中插入一级标题
- IT男关于肠胃的疗养-食补、豊宝酵素、中药