相关博客:Scott 数据 映射 MySQL Java
mapmap的功能是对于Stream中包含的元素使用给定的转换函数进行转换。转换后新生成的Stream类型不变
且只包含转换后生成的元素。 map接收一个函数作为参数,该函数会被应用到Stream中的每个元素上,并将其映射成一个新的元素。map()方法的声明如下:
Stream map(Function mapper)
示例1:将字符串转换为大写字符串。
public static void main(String[] args) {
List data = Arrays.asList("zhangsan", "lisi", "wanger", "mazi");
data.stream().map(String::toUpperCase).forEach(System.out::println);
}
示例2:获取名字长度大于8的部门的名称。
public static void main(String[] ar) {
List depts = DB.getDepts()();
depts.stream()
.map((item)-> item.getDname().length()>8 ? item.getDname() : "")
.forEach(System.out::println); //不建议,结果中会有几个""元素
depts.stream().map(Dept::getDname)
.filter(name->name.length()>8)
.forEach(System.out::println);
}
示例:求部门编号为10的部门的名称
public static void main(String[] args) {
String dname = DB.getDepts() //获取集合数据
.stream() //将集合转换为流
.filter(dept -> dept.getDeptno() == 10) //过滤,求编号为10的部门
.map(item -> item.getDname())//映射,求取部门的名称
.collect(Collectors.toList())//将流转换为集合
.get(0);//获取集合的第一个元素
System.out.println(dname);
}
示例:将员工的部门编号映射为部门名称
实现一:
-
在Emp类中添加如下代码:
private String dname; public String getDname() { return dname; } public void setDname(String dname) { this.dname = dname; }
-
测试代码
public static void main(String[] args) { //map方法的参数是一个一进一出的Lambda表达式,进出的类型可以相同也可以不相同 List emps = DB.getEmps(); emps.stream().map(item -> { //求部门编号所对应的名称 String dname = DB.getDepts() //获取集合数据 .stream() //将集合转换为流 .filter(dept -> dept.getDeptno() == item.getDeptno()) //过滤,求编号为10的部门 .map(dd -> dd.getDname())//映射,求取部门的名称 .collect(Collectors.toList())//将流转换为集合 .get(0);//获取集合的第一个元素 item.setDname(dname); return item; }).forEach(System.out::println); }
-
在Emp类中添加如下代码:
private String dname; public String getDname() { return dname; } public Emp setDname(String dname) { this.dname = dname; return this; }
-
测试代码
public static void main(String[] args) { DB.getEmps() .stream() .map(item -> item.setDname(DB.getDepts() .stream() .filter(dept -> dept.getDeptno() == item.getDeptno()) .map(dd -> dd.getDname()) .collect(Collectors.toList()) .get(0)) ) .forEach(System.out::println); }
map有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。比如:mapToInt就是把原始Stream转换成一个元素类型都是int的新Stream。这样三个变种方法可以免除自动装箱/拆箱的额外消耗。mapToInt用来将指定的流映射成为IntStream,该方法的声明如下:
IntStream mapToInt(ToIntFunction mapper)
示例3:采用mapToInt()方法求字符串数组中各元素的长度。
public static void main(String[] args) {
Stream.of("abc", "bb", "12334","awer")
.mapToInt(String::length)
.forEach(item-> System.out.print(item+" "));
}
flatMap
flatMap 作用和map类似,不同的是其每个元素转换得到的是Stream对象,它会把子Stream中的元素压缩到父集合中。可以利用flatMap生成一对多映射。该方法的定义如下所示:
Stream flatMap(Function mapper)
函数flatMap的作用是对每个元素执行mapper指定的操作,并用所有mapper返回的Stream中的元素组成一个新的Stream作为最终返回结果。说起来太拗口,通俗的讲flatMap()的作用就相当于把原stream中的所有元素都”摊平”之后组成新的Stream,转换前后元素的个数和类型都可能会改变。
示例4:演示flatMap()方法的用法。public static void main(String[] args) {
Stream is = Stream.of(Arrays.asList(1, 2),
Arrays.asList(3, 4, 5, 6), Arrays.asList(7, 8, 9));
Stream os = is.flatMap(item -> item.stream());
os.forEach(System.out::print);
}
上述代码中,原来的stream中有三个元素,分别是两个List,执行flatMap()之后,将每个List都“摊平”成了一个个的数字,所以会新产生一个由9个数字组成的Stream。所以最终将输出" 123456789"这9个数字。
示 例 5 : m a p ( ) 和 f l a t M a p ( ) 的 区 别 \color{red}{示例5:map()和flatMap()的区别} 示例5:map()和flatMap()的区别public class Demo {
public static Stream fun(String str){
List temp = new ArrayList();
for(int i =0;i{ // item表示Stream
item.forEach(System.out::print); // 对Stream进行处理
System.out.println();
});
Stream characterStream = data.stream().flatMap(Demo::fun);
characterStream.forEach(System.out::print);
}
}
结果: