餐饮手机微网站怎么做,wordpress 多语言建站,汽配外贸论坛,网页设计制作网站Java8实战-总结17 引入流流操作中间操作终端操作使用流 小结 引入流
流操作
java.util.stream.Stream中的Stream接口定义了许多操作。它们可以分为两大类。再来看一下前面的例子#xff1a;
ListString names menu.stream() //从菜单获得流 .filter(d - d.get… Java8实战-总结17 引入流流操作中间操作终端操作使用流 小结 引入流
流操作
java.util.stream.Stream中的Stream接口定义了许多操作。它们可以分为两大类。再来看一下前面的例子
ListString names menu.stream() //从菜单获得流 .filter(d - d.getcalories() 300) //中间操作.map(Dish::getName)//中间操作.limit(3)//中间操作.collect(toList());//将Stream转换为List可以看到两类操作
filter、map和limit可以连成一条流水线collect触发流水线执行并关闭它。
可以连接起来的流操作称为中间操作关闭流的操作称为终端操作。
中间操作
诸如filter或sorted等中间操作会返回另一个流。这让多个操作可以连接起来形成一个查询。重要的是除非流水线上触发一个终端操作否则中间操作不会执行任何处理。这是因为中间操作一般都可以合并起来在终端操作时一次性全部处理。
为了搞清楚流水线中到底发生了什么把代码改一改让每个Lambda都打印出当前处理的菜肴(就像很多演示和调试技巧一样这种编程风格要是搁在生产代码里那就吓死人了但是学习的时候却可以直接看清楚求值的顺序):
ListString names menu.stream().filter(d - {System.out.println(filtering d.getName()); //打印当前筛选的菜肴return d.getcalories() 300;}).map(d - {System.out.println(mapping d.getName());//提取菜名时打印出来return d.getName();}).limit(3).collect(toList());
System.out.println(names);此代码执行时将打印
filtering pork
mapping pork
filtering beef
mapping beef
filtering chicken
mapping chicken
[pork, beef, chicken]有好几种优化利用了流的延迟性质。第一尽管很多菜的热量都高于300卡路里但只选出了前三个。这是因为limit操作和一种称为短路的技巧第二尽管filter和map是两个独立的操作但它们合并到同一次遍历中了。
终端操作
终端操作会从流的流水线生成结果。其结果是任何不是流的值比如List、Integer,甚至void。例如在下面的流水线中forEach是一个返回void的终端操作它会对源中的每道菜应用一个Lambda。把System.out.println传递给forEach,并要求它打印出由menu生成的流中的每一个Dish:
menu.stream().forEach(System.out::println);测验:中间操作与终端操作
在下列流水线中找出中间操作和终端操作long count menu.stream().filter(d - d.getCalories() 300).distinct().limit(3).count();答案流水线中最后一个操作count返回一个long,这是一个非Stream的值。因此它是一个终端操作。所有前面的操作filter、distinct、limit,都是连接起来的并返回一个Stream,因此它们是中间操作。使用流
总而言之流的使用一般包括三件事
一个数据源(如集合)来执行一个查询一个中间操作链形成一条流的流水线一个终端操作执行流水线并能生成结果。
流的流水线背后的理念类似于构建器模式。在构建器模式中有一个调用链用来设置一套配置(对流来说这就是一个中间操作链),接着是调用built方法(对流来说就是终端操作)。
下表总结了前面在代码例子中看到的中间流操作和终端流操作。请注意这并不能涵盖Stream API提供的操作。
小结
以下是一些关键概念
流是“从支持数据处理操作的源生成的一系列元素”。流利用内部迭代迭代通过filter、map、sorted等操作被抽象掉了。流操作有两类中间操作和终端操作。filter和map等中间操作会返回一个流并可以链接在一起。可以用它们来设置一条流水线但并不会生成任何结果。forEach和count等终端操作会返回一个非流的值并处理流水线以返回结果。流中的元素是按需计算的。