Stream 不是数据结构,也没有内部储存结构;只是从其他数据结构抓取数据,它也绝不修改自己所封装的底层数据结构的数据。同时,stream 类似一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了。
1、stream的创建:
1.1、静态工厂方法:Stream<String> stringStream = Stream.of("aa", "bb", "cc");
1.2、Collection接口和数组的默认方法:int arr[] = new int[]{1, 2, 3}; Arrays.stream(arr) .forEach(System.out::println);
2、stream的常见操作:
2.1、map
//转换大写,wordList为单词集合List<String>类型 List<String> output = wordList.stream().map(String::toUpperCase).collect(Collectors.toList());
//这段代码生成一个整数 list 的平方数 {1, 4, 9, 16}。 List<Integer> nums = Arrays.asList(1, 2, 3, 4); List<Integer> squareNums = nums.stream().map(n -> n * n).collect(Collectors.toList());
2.2、filter
//留下偶数,经过条件“被 2 整除”的 filter,剩下的数字为 {2, 4, 6}。 Integer[] sixNums = {1, 2, 3, 4, 5, 6}; Integer[] evens =Stream.of(sixNums).filter(n -> n%2 == 0).toArray(Integer[]::new); //把每行的单词用 flatMap 整理到新的 Stream,然后保留长度不为 0 的,就是整篇文章中的全部单词了。 //REGEXP为正则表达式,具体逻辑具体分析 List<String> output = reader.lines(). flatMap(line -> Stream.of(line.split(REGEXP))). filter(word -> word.length() > 0).collect(Collectors.toList());
2.3、foreach
//打印所有男性姓名,roster为person集合类型为List<Pserson> // Java 8 roster.stream().filter(p -> p.getGender() == Person.Sex.MALE).forEach(p -> System.out.println(p.getName())); // Pre-Java 8 for (Person p : roster) { if (p.getGender() == Person.Sex.MALE) { System.out.println(p.getName()); } }
2.4、findFirst
它总是返回 Stream 的第一个元素,或者空。
2.5、Optional
这也是一个模仿 Scala 语言中的概念,作为一个容器,它可能含有某值,或者不包含。使用它的目的是尽可能避免 NullPointerException。
2.6、reduce
这个方法的主要作用是把 Stream 元素组合起来。它提供一个起始值(种子),然后依照运算规则(BinaryOperator),和前面 Stream 的第一个、第二个、第 n 个元素组合。从这个意义上说,字符串拼接、数值的 sum、min、max、average 都是特殊的 reduce。也有没有起始值的情况,这时会把 Stream 的前面两个元素组合起来,返回的是 Optional。
2.7、limit/skip
limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素
2.8、min/max/distinct
min 和 max 的功能也可以通过对 Stream 元素先排序,再 findFirst 来实现,但前者的性能会更好,为 O(n),而 sorted 的成本是 O(n log n)。同时它们作为特殊的 reduce 方法被独立出来也是因为求最大最小值是很常见的操作。
2.9、Match
Stream 有三个 match 方法,从语义上说:
allMatch:Stream 中全部元素符合传入的 predicate,返回 true
anyMatch:Stream 中只要有一个元素符合传入的 predicate,返回 true
noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true