Java8 流操作详细总结

一、流介绍

到底什么是流呢?

流,简短地定义是:从支持数据处理操作的源生成的元素序列。让我们一步步剖析这个定义。

  • 元素序列——就像集合一样,流也提供了一个接口,可以访问特定元素类型的一组有序 值。因为集合是数据结构,所以它的主要目的是以特定的时间/空间复杂度存储和访问元 素(如ArrayList 与 LinkedList)。但流的目的在于表达计算,比如你前面见到的 filter、sorted和map。集合讲的是数据,流讲的是计算。
  • 源——流会使用一个提供数据的源,如集合、数组或输入/输出资源。 请注意,从有序集 合生成流时会保留原有的顺序。由列表生成的流,其元素顺序与列表一致。
  • 数据处理操作——流的数据处理功能支持类似于数据库的操作,以及函数式编程语言中 的常用操作,如filter、map、reduce、find、match、sort等。流操作可以顺序执行,也可并行执行。

二、流操作介绍

java.util.stream.Stream中的Stream接口定义了许多操作。它们可以分为两大类。我们来看一个例子:

List<String> names = menu.stream()
    .filter(d -> d.getCalories() > 300)
    .map(Dish::getName)
    .limit(3)
    .collect(toList());

你可以看到两类操作: 

  • filter、map和limit可以连成一条流水线,也称为中间操作。
  • collect触发流水线执行并关闭它,称为终端操作。

中间操作

诸如filter或sorted等中间操作会返回另一个流。这让多个操作可以连接起来形成一个查询。重要的是,除非流水线上触发一个终端操作,否则中间操作不会执行任何处理——它们很懒。 这是因为中间操作一般都可以合并起来,在终端操作时一次性全部处理。

public class Test1 {
    public static void main(String[] args) {
        Student s1 = new Student("冯某某",24,"郑州市");
        Student s2 = new Student("和某人",28,"信阳市");
        Student s3 = new Student("岳女士",30,"登封市");
        Student s4 = new Student("许女士",32,"周口市");
        List<Student> studentList = new ArrayList<>();
        studentList.add(s1);
        studentList.add(s2);
        studentList.add(s3);
        studentList.add(s4);
        List<String> list = studentList.stream()
                .filter(student -> {
                    System.out.println("filter:"+student);
                    return student.getAge()>25;})
                .map(student -> {
                    System.out.println("map:"+student);
                    return student.getName();})
                .limit(2)
                .collect(Collectors.toList());
        System.out.println(list);
    }
}

输出如下: 

filter:Student{name='冯某某', age=24, address='郑州市', isCoder=false, phoneNumber=0}
filter:Student{name='和某人', age=28, address='信阳市'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值