0.前言
各位看官,本片文章中的
文字描述部分
是核心
,务必通读后再去看代码,否则可能有些吃力
1.方法描述
1.1 map
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
【功能说明】:返回一个包含【给定功能处理结果】的Stream对象。
【举例说明1】 :输入一个字符串“a”,功能方法中将字符串添加了前缀 “perfix_”,则返回的Stream对象中的元素为 :【字符串 :“perfix_a”】;
【举例说明2】:输入一个字符串“a-b-c”,功能方法中将字符串按照'-'进行分割,则返回的Stream对象中的元素为 : 【数组 : ["a","b","c"]】。
1.2 flapMap
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
【功能说明】:返回一个包含【给定功能处理结果的【最底层元素】】的Stream对象。(扁平化处理)
【举例说明】:输入一个字符串“a-b-c”,功能方法中将字符串按照'-'进行分割,则返回的Stream对象中的元素为 : 【三个字符串元素 : “a”,“b”,“c”】,
不再是分割之后的字符串数组了。
(当然,这个返回的Stream对象,必须显式的声明出来)
【特点】:flapMap 可以和 map 配合使用,更容易理解。
当然,单独使用,也是没有问题的。
2.需求描述
存在一个字符串数组 : String[] strs = {"1-0-0", "2-0-0", "3-0-0","4-0-0","5-0-0","6-0-0"};
要求 : 将字符串数组中的每个元素按照“-”进行分割,然后将分割之后的单个字符去重,最后输出结果;
目标结果 :[1,0,2,3,4,5,6]
3.案例代码
本案例代码中 包含了 map 和 flatMap 两个方法的使用,以增强二者差别的对比
3.1 代码
package com.northcastle.I_stream;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamTest16FlatMap {
public static void main(String[] args) {
String[] strs = {"1-0-0", "2-0-0", "3-0-0","4-0-0","5-0-0","6-0-0"};
//1.使用map的情况,不能实现需求
Stream.of(strs)
.map(s->s.split("-"))
.distinct()
.forEach(strings -> System.out.println(Arrays.toString(strings)));
System.out.println("============");
//2.使用 flapMap + map的方式,将map的结果进行扁平化处理,可以实现需求
List<String> strList = Stream.of(strs)
.map(s -> s.split("-"))// map 将字符串分割,形成字符串数组
.flatMap(strArray -> Stream.of(strArray)) // 使用普通的Lambda表达式的写法,更好理解
//.flatMap(Arrays::stream) // 使用 方法引用的写法
.distinct()
.collect(Collectors.toList());
System.out.println(strList);
System.out.println("============");
//3.只使用flatMap的方式,也可以实现需求
List<String> strList02 = Stream.of(strs)
.flatMap(s -> {
String[] splitArray = s.split("-");
return Stream.of(splitArray);
})
.distinct()
.collect(Collectors.toList());
System.out.println(strList);
}
}
3.2 运行结果
4.完成
Congratulations!
You are one step closer to success!