码迷,mamicode.com
首页 > 编程语言 > 详细

Java 8 (4) Stream 流 - 使用

时间:2018-07-07 13:40:23      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:提取   color   选择   截断   函数   stream   span   mit   col   

在本节中将介绍Stream API支持的许多操作,这些操作可以完成更复杂的数据查询,如筛选、切片、映射、查找、匹配和归约。还有一些特殊的流如:数值流、来自文件和数组等多种来源的流。

 

筛选和切片

  1.用谓词筛选

    Streams接口支持filter方法,该操作会接受一个谓词作为参数,并返回一个包含所有符合谓词的元素的流。例如筛选出所有素菜:

List<Dish> vegetarianMenu = menu.stream().filter(Dish::isVegetarian).collect(toList());

  2.筛选各异的元素

    流海支持一个叫做distinct的方法,它会返回一个元素各异(根据流所生成的元素的hashCode和equals方法的实现)的流。例如筛选所有的偶数并确保没有重复的:

        List<Integer> nums = Arrays.asList(1,2,3,13,12,2,1,2,2,1,2,2,3,4,5);
        List<Integer> oddNums = nums.stream().filter(s->s%2==0).distinct().collect(toList());

  3.截断流

    流支持limit(n)方法,该方法会返回一个不超过给定长度的流,所需的长度作为参数传递给limit,如果流是有序的,则最多返回前n个元素。例如筛选热量超过300卡路里的前3道菜:

List<Dish> limit3 = menu.stream().filter(c->c.getCalories()>300).distinct().limit(3).collect(toList());

  4.跳过元素

    流还支持skip(n)方法,该方法会返回一个扔掉了前n个元素的流,如果流中元素U不足n个,则返回一个空流。例如:跳过超过300卡路里的头两道菜,并返回剩下的。

List<Dish> skip2 = menu.stream().filter(c->c.getCalories()>300).distinct().skip(2).collect(toList());

 

映射

  比如在SQL中,你可以选择从表中选择一列,Stream API也通过map和flatMap方法提供了类似的工具。

  1.对流中每一个元素应用函数

    流支持map方法,它接受一个函数作为参数。这个函数会被应用到每个元素上,并将其映射成一个新的元素。例如下面把Dish::getName传给了map方法,来提取流中的菜名:

List<String> names = menu.stream().map(Dish::getName).collect(toList());

    因为getName返回一个String,所以map方法输出的流的类型就是Stream<String>。例如下面把List<String> 映射为List<Integer> 值是String的长度。

List<String> strs = Arrays.asList("lambda","action","java 8","stream");
List<Integer> ints = strs.stream().map(String::length).collect(toList());

    如果要找出每道菜的名称有多长可以再加上一个map:

List<Integer> nameLength = menu.stream().map(Dish::getName).map(String::length).collect(toList());

  2.流的扁平化

    

 

Java 8 (4) Stream 流 - 使用

标签:提取   color   选择   截断   函数   stream   span   mit   col   

原文地址:https://www.cnblogs.com/baidawei/p/9276833.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!