运维开发网

java基础理论流管道流图操作演示实例

运维开发网 https://www.qedev.com 2022-09-23 16:04 出处:网络
这篇文章主要未大家介绍了java基础理论Stream管道流Map操作方法示例解析,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步

这篇文章主要未大家介绍了java基础理论Stream管道流Map操作方法示例解析,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步


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

最简单的要求:将集合中的每个字符串都转换成大写!

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

因此,map的功能是转换管道流中的每个数据元素。



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

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

Listlt;Integergt; 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。还有毛托龙,mapToDouble等等。


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

或者使用上一节中的Employee类创建10个对象。要求如下:

将每一个Employee的年龄增加一岁将性别中的ldquo;Mrdquo;换成ldquo;malerdquo;,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"); Listlt;Employeegt; employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); /*Listlt;Employeegt; maped = employees.stream() .map(e -gt; { e.setAge(e.getAge() + 1); e.setGender(e.getGender().equals("M")"male":"female"); return e; }).collect(Collectors.toList());*/ Listlt;Employeegt; maped = employees.stream() .peek(e -gt; { e.setAge(e.getAge() + 1); e.setGender(e.getGender().equals("M")"male":"female"); }).collect(Collectors.toList()); System.out.println(maped);}

由于map的参数E是返回值,所以可以使用peek函数。Peek函数是一种特殊的映射函数,可以在函数没有返回值或者参数为返回值的情况下使用。


四、flatMap

Map可以转换管道流中的数据,但是管道中有管道怎么办?也就是如何处理二维数组和二维集合类。实现一个简单的要求:改变ldquohellordquo,ldquoworldrdquo一组两个字符串,元素的每个字母都打印出来。如果不用Stream,怎么写呢?编写了两层for循环,第一层遍历字符串并将字符串拆分成char数组,第二层通过for循环遍历char数组。

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

输出打印结果:

java.util.stream.ReferencePipeline$Head@3551a94java.util.stream.ReferencePipeline$Head@531be3c5

用地图方法做不到,这个要求用地图方法也实现不了。Map只能对一维数组进行操作。数组中有数组,管道中有管道。它不能处理每一个元素。


FlatMap可以理解为将几个子管道中的所有数据展开到父管道中进行处理。


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

输出打印结果:

h
e
l
l
o
w
r
d

以上是java Stream pipeline Map基本理论的详细操作示例。更多关于java Stream管道图操作的信息

0

精彩评论

暂无评论...
验证码 换一张
取 消