您当前的位置: 首页 > 

梁云亮

暂无认证

  • 1浏览

    0关注

    1211博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Stream API ---- 映射Map

梁云亮 发布时间:2019-10-22 17:14:19 ,浏览量:1

Java Stream API ---- 映射

相关博客:Scott 数据 映射 MySQL Java

map

map的功能是对于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);
}
示例:将员工的部门编号映射为部门名称 实现一:
  1. 在Emp类中添加如下代码:

    private String dname;
    
    public String getDname() {
        return dname;
    }
    
    public void setDname(String dname) {
        this.dname = dname;
    }
    
  2. 测试代码

    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);
    }
    
实现二:
  1. 在Emp类中添加如下代码:

    private String dname;
    
    public String getDname() {
        return dname;
    }
    
    public Emp setDname(String dname) {
        this.dname = dname;
        return this;
    }
    
  2. 测试代码

    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);
    }
}
结果:

在这里插入图片描述

关注
打赏
1665409997
查看更多评论
立即登录/注册

微信扫码登录

0.0425s