Java 8 新特性 Stream 和 Lambda函数

什么是 Stream?

Stream(流)是一个来自数据源的元素队列并支持聚合操作

生成流

在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。

  • parallelStream() − 为集合创建并行流。

1、使用parallelStream方法可以得到一个并行流,并行流底层使用的是Fork/Join框架,对于一些计算量比较大的任务,使用并行流可能极大的提升效率。

流的操作

当把一个数据结构包装成 Stream 后,就要开始对里面的元素进行各类操作了。常见的操作可以归类如下。

  • Intermediate:

map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

  • Terminal:

forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

  • Short-circuiting:

anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

Stream的主要方法:

1.将strings正序输出并去重去空,并在每个元素的结尾加"!!!":

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl", "bc");
strings.stream()
        .filter(string -> !string.isEmpty())    // 过滤空字符串
        .distinct()                             // 去重
        .sorted()                     // 正序输出
        .map(s -> s + " !!! ")                  // 将每一个元素加上"!!!"后,再映射到其相对应的位置
        .forEach(System.out::println);          // 循环遍历输出

运行结果如下:

2.按学生年龄正序,成绩倒序输出

 List<Student> list = new ArrayList<>();
        list.add(new Student("zs", 21, 84));
        list.add(new Student("ls", 20, 84));
        list.add(new Student("wu", 26, 84));
        list.add(new Student("zl", 20, 64));

        list.stream().sorted(Comparator.comparing(Student::getAge).reversed()
                .thenComparing(Student::getScore).reversed())
                .forEach(System.out::println);

3.Collectors(点击进入)

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:

常见方法: Collectors(toList()、toSet()、toCollection()、joining()、partitioningBy()、collectingAndT)

 

posted @ 2019-07-05 09:06  草莓罐头  阅读(648)  评论(0编辑  收藏  举报