学科分类
目录
Java基础

聚合操作简介

在开发中,多数情况下会涉及到对集合、数组中元素的操作,在JDK 8之前都是通过普通的循环遍历出每一个元素,然后还会穿插一些if条件语句选择性的对元素进行查找、过滤、修改等操作,这种原始的操作方法虽然可行,但是代码量较大并且执行效率较低。

为此,JDK 8中新增了一个Stream接口,该接口可以将集合、数组的中的元素转换为Stream流的形式,并结合Lambda表达式的优势来进一步简化集合、数组中元素的查找、过滤、转换等操作,这一新功能就是JDK 8中的聚合操作。

在程序中,使用聚合操作没有绝对的语法规范,根据实际操作流程,主要可以分为以下3个步骤:

(1)将原始集合或者数组对象转换为Stream流对象;

(2)对Stream流对象中的元素进行一系列的过滤、查找等中间操作(Intermediate Operations),然后仍然返回一个Stream流对象;

(3)对Stream流进行遍历、统计、收集等终结操作(Terminal Operation),获取想要的结果。

接下来,就根据上面聚合操作的3个步骤,通过一个案例来演示聚合操作的基本用法,如文件1所示。

文件1 Example31.java

 1    import java.util.*;
 2    import java.util.stream.Stream;
 3    public class Example31 {
 4        public static void main(String[] args) {
 5              // 创建一个List集合对象
 6            List<String> list = new ArrayList<>(); 
 7            list.add("张三");
 8            list.add("李四");
 9            list.add("张小明");
 10            list.add("张阳");
 11            // 1、创建一个Stream流对象
 12            Stream<String> stream = list.stream();
 13            // 2、对Stream流中的元素分别进行过滤、截取操作
 14            Stream<String> stream2 = stream.filter(i -> i.startsWith("张"));
 15            Stream<String> stream3 = stream2.limit(2);
 16            // 3、对Stream流中的元素进行终结操作,进行遍历输出
 17            stream3.forEach(j -> System.out.println(j));
 18            System.out.println("=======");
 19             // 通过链式表达式的形式完成聚合操作
 20            list.stream().filter(i -> i.startsWith("张"))
 21                         .limit(2)
 22                         .forEach(j -> System.out.println(j));
 23        }
 24    }

运行结果如图1所示。

图1 运行结果

文件1中,先创建了一个List集合,然后根据聚合操作的3个步骤实现了集合对象的聚合操作,对集合中的元素使用Stream流的形式进行过滤(filter)、截取(limit),并进行遍历输出。其中第12~17行代码分步骤详细展示了聚合操作,而第20~22行代码是使用了链式表达式(调用有返回值的方法时不获取返回值而是直接再调用另一个方法)实现了聚合操作,该表达式的语法格式更简洁、高效,这种链式调用也被称为操作管道流。

小提示:

在JDK 8中使用聚合操作时,通常会涉及到两个新的名词Intermediate Operations(中间操作)和Terminal Operation(终结操作),Java官方并没有对中间操作和终结操作的概念进行详细说明,只是为了便于区分和管理聚合操作步骤中的方法,将这些方法根据返回类型进行了区分:将执行某个方法后返回类型仍为Stream流对象的方法归类为中间操作,如过滤、截取、排序等方法。而将执行方法后返回类型不再是Stream流对象的方法归类为终结操作,如遍历、统计、收集等方法。

需要注意的是,在进行聚合操作时,只是改变了Stream流对象中的数据,并不会改变原始集合或数组中的源数据。

点击此处
隐藏目录