学习任务:

视频学习

动手测试map()

map()方法对元素进行转换,API如下:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

流元素经过Function函数式接口的处理返回一个值,这些值组成一个新的流。

测试代码如下:

	//map()测试,提取出课程名称组成一个流
	public static void test_map() {
		//创建collection集合
        List<PbCourse> list = new ArrayList<>() ;
        list.add(new PbCourse(100L, "攀博课堂-Java面向对象教程", 33));
        list.add(new PbCourse(101L, "攀博课堂-Spring全家桶教程", 44));
        list.add(new PbCourse(102L, "攀博课堂-SpringCloud微服务教程", 55));
        list.add(new PbCourse(103L, "攀博课堂-在线教育分布式项目教程", 66));
        list.add(new PbCourse(104L, "攀博课堂-电子商务项目教程", 66));
		//提取课程名称生成一个新流,输入课程对象,输出课程名称
        Stream<String> stream = list.stream().map(x->x.getCourseName());
        //遍历新流
        stream.forEach(System.out::println);
	}

输出:

攀博课堂-Java面向对象教程
攀博课堂-Spring全家桶教程
攀博课堂-SpringCloud微服务教程
攀博课堂-在线教育分布式项目教程
攀博课堂-电子商务项目教程

下边实现提取出课程id、课程对象组成map,生成新流:

	//map()测试,提取出课程id、课程对象组成map,生成新流
	public static void test_map_1() {
		//创建collection集合
        List<PbCourse> list = new ArrayList<>() ;
        list.add(new PbCourse(100L, "攀博课堂-Java面向对象教程", 33));
        list.add(new PbCourse(101L, "攀博课堂-Spring全家桶教程", 44));
        list.add(new PbCourse(102L, "攀博课堂-SpringCloud微服务教程", 55));
        list.add(new PbCourse(103L, "攀博课堂-在线教育分布式项目教程", 66));
        list.add(new PbCourse(104L, "攀博课堂-电子商务项目教程", 66));
        //提取课程名称生成一个新流
        list.stream().map(x->{
            Map<Long,PbCourse> map = new HashMap<>();
            map.put(x.getId(),x);
            return map;
        })
        .forEach(m->{
            m.forEach((key,value)-> System.out.println("key="+key+"  value="+value));
        });
	}

输出:

{100=PbCourse [id=100, courseName=攀博课堂-Java面向对象教程, price=33, category=null]}
{101=PbCourse [id=101, courseName=攀博课堂-Spring全家桶教程, price=44, category=null]}
{102=PbCourse [id=102, courseName=攀博课堂-SpringCloud微服务教程, price=55, category=null]}
{103=PbCourse [id=103, courseName=攀博课堂-在线教育分布式项目教程, price=66, category=null]}
{104=PbCourse [id=104, courseName=攀博课堂-电子商务项目教程, price=66, category=null]}

下边实现对包括List的流进行转换:

//map测试,提取list并处理
	public static void test_map_2() {
		//创建collection集合
        List<PbCourse> list1 = new ArrayList<>() ;
        list1.add(new PbCourse(100L, "攀博课堂-Java基础语法教程", 0));
        list1.add(new PbCourse(101L, "攀博课堂-Java面向对象教程", 0));
        list1.add(new PbCourse(102L, "攀博课堂-Java面向对象进阶教程", 0));
        list1.add(new PbCourse(103L, "攀博课堂-Java Lambda函数式编程教程", 0));

        List<PbCourse> list2 = new ArrayList<>() ;
        list2.add(new PbCourse(201L, "攀博课堂-Spring全家桶教程", 0));
        list2.add(new PbCourse(202L, "攀博课堂-SpringCloud微服务教程", 0));
        list2.add(new PbCourse(203L, "攀博课堂-在线教育分布式项目教程", 0));
        list2.add(new PbCourse(204L, "攀博课堂-电子商务项目教程", 0));

        List<List<PbCourse>> list_all = new ArrayList<>();
        list_all.add(list1);
        list_all.add(list2);
        //要求使用map()对上边list_all进行处理,根据价格判断是否免费,如果为0则在名称前加“免费”,否则添加“收费”
        //第一步生成流
        Stream<List<PbCourse>> stream = list_all.stream();
        //第二步转换
        Stream<Stream<PbCourse>> streamStream = stream.map(s -> s.stream().map(x -> {
            int price = x.getPrice();
            if (price == 0) {
                x.setCourseName("[免费]" + x.getCourseName());
            } else {
                x.setCourseName("[收费]" + x.getCourseName());
            }
            return x;
        }));
        //输出
        streamStream.forEach(x->x.forEach(i-> System.out.println(i)));
	}

输出:

PbCourse [id=100, courseName=[免费]攀博课堂-Java基础语法教程, price=0, category=null]
PbCourse [id=101, courseName=[免费]攀博课堂-Java面向对象教程, price=0, category=null]
PbCourse [id=102, courseName=[免费]攀博课堂-Java面向对象进阶教程, price=0, category=null]
PbCourse [id=103, courseName=[免费]攀博课堂-Java Lambda函数式编程教程, price=0, category=null]
PbCourse [id=201, courseName=[免费]攀博课堂-Spring全家桶教程, price=0, category=null]
PbCourse [id=202, courseName=[免费]攀博课堂-SpringCloud微服务教程, price=0, category=null]
PbCourse [id=203, courseName=[免费]攀博课堂-在线教育分布式项目教程, price=0, category=null]
PbCourse [id=204, courseName=[免费]攀博课堂-电子商务项目教程, price=0, category=null]

上边代码可以使用链式编码如下:

 //链式编程
        list_all.stream().map(s -> s.stream().map(x -> {
            int price = x.getPrice();
            if (price == 0) {
                x.setCourseName("[免费]" + x.getCourseName());
            } else {
                x.setCourseName("[收费]" + x.getCourseName());
            }
            return x;
        })).forEach(x->x.forEach(i-> System.out.println(i)));
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题