Java8——Stream的概述

Java8开始提供了Stream API,这些API方法是用函数式编程方式在对一批数据集合进行复杂操作的工具,简称“流”。

public interface Stream< T >
  extends BaseStream<T,Stream< T >>

  Java8开始提供了Stream API,这些API方法是用函数式编程方式在对一批数据集合进行复杂操作的工具,简称“流”。流的特点如下:

  1. Stream将不同的操作使用不同的方法来描述,比如filter、map、reduce、find、match、sort,它的数据处理类似于数据库的操作。我们只需要编写核心的代码逻辑,这样可以让我们在一定程度上摆脱循环遍历、if判断等控制语句的编写,相当于对集合的操作做了更高层次的抽象。
  2. 相比于集合的操作,很多流操作本身会返回一个流。对于filter过滤、sorted排序、map收集等等操作,它们都是一个个的动作,因此我们还可以将这些动作链接起来,来表达复杂的数据处理流水线,比如先过滤,然后排序,最后收集输出……
  3. 就像集合必须存放数据一样,流也需要一个提供数据的源,这个源可以是集合、数组、或者一个函数!如果数据源是有序的,那么生成的流也是有序的!
  4. 流操作可以单线程顺序执行,也可多线程并行执行。
  5. 获得流之后,流里面的数据就不能在增加或者删除了,所有的操作都是基于流中现有的数据的操作。和迭代器类似,一个流只能被使用(遍历)一次,如果我们还需要其他按要求,此时只能从数据源那么再一次获取一个新的流。
  6. 使用普通集合操作元素,需要我们写迭代的代码,这被称为外部迭代,比如for、while、foreach,而流则帮助我们进行了内部数据迭代,这就有了并行迭代优化速度的可能,而我们无需关心它是怎么做的!
  7. 流元素按需计算,比如要找出大于10 的第一个数字,那么并不需要和所有元素去做比较,只要找出第一个匹配的元素就够了。
  8. Streams有一个BaseStream.close()方法和实现AutoCloseable,但几乎所有的流实例实际上不需要在使用后关闭。 一般来说,只有来源为IO通道的流(如Files.lines(Path, Charset)返回的流 )才需要关闭。 大多数流都由集合,数组或生成函数支持,这些函数不需要特殊的资源管理。 (如果流确实需要关闭,则可以在try -with-resources语句中将其声明为资源。)
  9. Stream API通常是接口一个函数式接口为参数,因此对lambda的支持非常好,Stream API配合lambda表达式,我们可以写出非常漂亮且简练的链式编程代码!可以说,要想把流用得好,那么lambda表达式必须先掌握,关于lambda表达式可以看这篇文章:Java8——Lambda表达式的详解

  先看看一个常见的普通集合操作和流操作的代码对比,体验流式编程的连续性以及简单性:

public class StreamFrist {
    public static void main(String[] args) {
        //学生集合,学生有age-年龄 ,name-名字,score-分数,三个属性
        List<Student> students = new ArrayList<>();
        students.add(new Student(10, 55, "小花"));
        students.add(new Student(13, 100, "小华"));
        students.add(new Student(9, 85, "晓华"));
        students.add(new Student(8, 70, "肖华"));


        //我们需要筛选出成绩大于等于60的学生名字

        //使用普通集合操作
        ArrayList<String> nameList1 = new ArrayList<>();
        for (Student student : students) {
            if (student.getScore() >= 60) {
                nameList1.add(student.getName());
            }
        }

        //使用流,不同的操作都是链式的,非常适合人类的思维,而不需要考虑迭代、判断操作
        List<String> nameList2 = students.stream()
                //筛选出成绩大于等于60的学生
                .filter(student -> student.getScore() >= 60)
                //收集学生名字
                .map(Student::getName)
                //返回结果
                .collect(toList());
    }
}
  • 发表于 2020-09-16 15:41
  • 阅读 ( 31 )

0 条评论

请先 登录 后评论
NX小编
NX小编

1209 篇文章

作家榜 »

  1. NX小编 1209 文章
  2. 58沈剑 309 文章
  3. 奈学教育 137 文章
  4. 李希沅 | 奈学教育 36 文章
  5. 江帅帅 | 奈学教育 29 文章
  6. 林淮川 | 奈学教育 12 文章
  7. 科技热点 10 文章
  8. 邱鹏超 2 文章