-
介绍
java stream是Java 8提供的一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的API和新增Stream操作。常用于集合对象的计算,与Lambda表达式结合,可以提高编程效率、简洁性和程序可读性。 -
特性
不是数据结构:stream不会存储元素,而是按需计算。
支持函数式编程:stream操作可以接收Lambda表达式作为参数,实现函数式编程风格。
支持并行处理:stream可以利用多核处理器进行并行处理,提高性能。
支持管道操作:stream操作可以串联成一个管道,实现流式风格的编程。
支持聚合操作:stream操作可以实现类似SQL语句的聚合功能,如filter, map, reduce, find, match, sorted等。 -
值获取
集合:Collection接口中有一个stream()方法,可以获取串行流;parallelStream()方法,可以获取并行流。
数组:Arrays类中有一个stream()方法,可以根据数组创建流。
值:Stream接口中有一个of()方法,可以根据一组值创建流。
文件:Files类中有一些静态方法,可以根据文件创建流。
函数:Stream接口中有一些静态方法,可以根据函数生成无限流。 -
操作
中间操作:返回值仍然是Stream接口类型的方法,可以继续进行流操作。中间操作是惰性的,只有遇到终止操作时才会执行。
终止操作:返回值不再是Stream接口类型的方法,表示流操作结束。终止操作会触发中间操作的执行,并产生最终结果。 -
常用的stream操作
操作 类型 作用 举例 filter 中间 根据条件过滤元素 list.stream().filter(x -> x > 10) map 中间 根据函数映射每个元素 list.stream().map(x -> x * 2) flatMap 中间 根据函数映射每个元素,并将多个流合并为一个流 list.stream().flatMap(x -> Stream.of(x.split(""))) distinct 中间 去除重复元素 list.stream().distinct() sorted 中间 对元素进行排序 list.stream().sorted() limit 中间 截取前n个元素 list.stream().limit(5) skip 中间 跳过前n个元素 list.stream().skip(5) concat 中间 合并两个流为一个流 Stream.concat(stream1, stream2) forEach 终止 对每个元素执行消费动作 list.stream().forEach(System.out::println) count 终止 统计元素个数 list.stream().count() collect 终止 将流转换为其他形式的结果,如List, Set, Map等 list.stream().collect(Collectors.toList()) reduce 终止 对流中的元素进行归约操作,如求和,求积,求最大值等 list.stream().reduce((x, y) -> x + y) findFirst 终止 返回第一个元素的Optional对象 list.stream().findFirst() findAny 终止 返回任意一个元素的Optional对象 list.stream().findAny() anyMatch 终止 判断是否有任意一个元素满足条件 list.stream().anyMatch(x -> x > 10) allMatch 终止 判断是否所有元素都满足条件 list.stream().allMatch(x -> x > 10) noneMatch 终止 判断是否没有元素满足条件 list.stream().noneMatch(x -> x > 10) -
过滤空字符串
Liststrings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); // 获取空字符串的数量 long count = strings.stream().filter(string -> string.isEmpty()).count(); System.out.println("空字符串的数量:" + count); // 获取非空字符串的列表 List filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); System.out.println("非空字符串的列表:" + filtered); -
对数字列表进行操作
Listnumbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); // 获取对应的平方数并去重 List squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList()); System.out.println("平方数并去重:" + squaresList); // 获取列表中的最大值和最小值 Optional max = numbers.stream().max(Integer::compare); Optional min = numbers.stream().min(Integer::compare); System.out.println("最大值:" + max.orElse(0)); System.out.println("最小值:" + min.orElse(0)); // 获取列表中的总和和平均值 int sum = numbers.stream().reduce(0, Integer::sum); double average = numbers.stream().mapToInt(Integer::intValue).average().orElse(0.0); System.out.println("总和:" + sum); System.out.println("平均值:" + average); -
对字符串列表进行排序和拼接
Listnames = Arrays.asList("张三", "李四", "王五", "赵六", "孙七"); // 按字典顺序排序 List sortedNames = names.stream().sorted().collect(Collectors.toList()); System.out.println("按字典顺序排序:" + sortedNames); // 按长度逆序排序 List reversedNames = names.stream().sorted((s1, s2) -> s2.length() - s1.length()).collect(Collectors.toList()); System.out.println("按长度逆序排序:" + reversedNames); // 拼接成一个字符串,用逗号分隔 String joinedNames = names.stream().collect(Collectors.joining(", ")); System.out.println("拼接成一个字符串:" + joinedNames);