lambdastream循环_恕我直⾔你可能真的不会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.UpperCase());
java stream}
System.out.println(alphaUpper); //[MONKEY, LION, GIRAFFE, LEMUR]
/
/ 使⽤Stream管道流
List<String> collect = alpha.stream().map(String::toUpperCase).List());
//上⾯使⽤了⽅法引⽤,和下⾯的lambda表达式语法效果是⼀样的
//List<String> collect = alpha.stream().map(s -> s.toUpperCase()).List());
System.out.println(collect); //[MONKEY, LION, GIRAFFE, LEMUR]
所以map函数的作⽤就是针对管道流中的每⼀个数据元素进⾏转换操作。
⼆、处理⾮字符串类型集合元素
map()函数不仅可以处理数据,还可以转换数据的类型。如下:
List<Integer> lengths = alpha.stream()
.map(String::length)
.List());
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.Age() + 1);
e.Gender().equals("M")?"male":"female");
return e;
}).List());*/
List<Employee> maped = employees.stream()
.peek(e -> {
e.Age() + 1);
e.Gender().equals("M")?"male":"female");
}).List());
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深⼊浅出系列》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论