第五章(2)使用流-----映射

1.map映射的基本使用

      一个非常常见的数据处理套路就是从某些对象中选择信息。比如在SQL里,你可以从表中选择一列。Stream API也通过map和flatMap方法提供了类似的工具。

List<Dish> menu = Arrays.asList( new Dish("pork", false, 800, Dish.Type.MEAT), 
				   new Dish("beef", false, 700, Dish.Type.MEAT), 
				   new Dish("chicken", false, 400, Dish.Type.MEAT), 
				   new Dish("french fries", true, 530, Dish.Type.OTHER), 
				   new Dish("rice", true, 350, Dish.Type.OTHER), 
				   new Dish("season fruit", true, 120, Dish.Type.OTHER),
				   new Dish("pizza", true, 550, Dish.Type.OTHER),
				   new Dish("prawns", false, 300, Dish.Type.FISH), 
				   new Dish("salmon", false, 450, Dish.Type.FISH) );

List<String> dishName = menu.parallelStream().map(Dish::getName).collect(Collectors.toList());	

再比如,给定一个List<string>,要你提取每个元素的长度形成一个List:

继续比如,我们想获取菜品名称的长度呢?

第二个map是提取了Stream<String>流中的字符长度。

2.数组的流获取

一个普通的数组是怎么转换为流呢?Arrays类中提供了stream方法:

3.流的扁平化(合并)flatMap

     思考一个问题,给定单词列表["Hello","World"],你想要返回列表["H","e","l", "o","W","r","d"]。你可能会想到下面的处理方法:

我们发现失败了,从报错信息来看,split方法吧每个单词分隔后形成了一个数组,故此时的map返回的流Stream的类型是Stream<String[]>类型的一个List列表,而我们真正想要的是Stream<String>。上面我们知道了将数组转换为流的方法,那么我们现在就可以试试:

我们发现仍然不行,通过报错信息我们知道虽然我们把每个单词分隔的字母形成的数组转换为流,但是因为是多个单词的分隔而形成的多个数组,所以第二个map转化出来的流是一个stream<string>的列表!

这个时候,就要有请我们的flatMap方法登场了,它可以把流的列表合并为一个:

处理的流程图如下:

一道练习题:

给定两个列表[1,2,3]和[3,4],请拼凑出[[1,3],[1,4],[2,1],[2,4],[3,3],[3,4]]

再扩展一次:只要两个和能被3 整除的

猜你喜欢

转载自blog.csdn.net/qq564425/article/details/81517163