title:Java的Stream表达式
Java的Stream表达式
一、如何理解Stream
-
Java8新特性
Stream可以理解为管道,管道里的流水就是数据,管道里可以对水进行处理,如过滤,消毒,净化等等操作。最后流出的水才能喝。
所以我理解Stream关注的是对数据的加工计算。对比java集合框架,集合框架关注的是如何存取数据。
-
一个stream操作主要有3个部分:源头、中间操作、终止操作。
中间操作可以有0个或多个 但不是立马执行的,只有终止操作被调用后中间操作才会一起执行(惰性执行)
-
有了stream操作后 会简化我们的操作,如循环
如循环一个数组,打印,如下操作,而非原来的for循环,是否很简洁
int[] intArray = new int[]{2,4,6,1}; Arrays.stream(intArray).forEach(System.out::println);
二、Stream的数据来源
-
数组
int[] intArray = new int[]{2,4,6,1}; Arrays.stream(intArray).forEach(System.out::println); Stream.of(intArray).forEach(System.out::println);
-
集合
strList.stream().forEach(System.out::println); Stream.of(strList).forEach(System.out::println);
三、中间操作
-
主要有filter map flatmap sorted skip limit distinct
-
筛选与切片 filter、limit、skip、distinct
//filter --帅选出想要的数据 List<String> list = Arrays.asList("bbb", "aaa", "ddd", "aaa", "ccc", "ddd", "eee"); list.stream().filter(e -> "aaa".equals(e)).forEach(e -> System.out.print(e + " ")); outPut : aaa aaa //limit --截断流,使其元素不能超过给定数量 List<String> list = Arrays.asList("bbb", "aaa", "ddd", "aaa", "ccc", "ddd", "eee"); list.stream().filter(e -> "aaa".equals(e)).limit(1).forEach(e -> System.out.print(e + " ")); outPut : aaa //ship --跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流,与limit(n)互补 List<String> list = Arrays.asList("bbb", "aaa", "ddd", "aaa", "ccc", "ddd", "eee"); list.stream().skip(2).forEach(e -> System.out.print(e + " ")); outPut : ddd aaa ccc ddd eee //distinct --筛选,通过流所生成元素的hashCode()和equals()去除重复元素 List<String> list = Arrays.asList("bbb", "aaa", "ddd", "aaa", "ccc", "ddd", "eee"); list.stream().distinct().forEach(e -> System.out.print(e + " ")); outPut : bbb aaa ddd ccc eee
-
映射 map、flatmap
//map --将元素转换成其他形式或提取信息。接收另一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。 List<String> list = Arrays.asList("bbb", "aaa", "ddd", "aaa", "ccc", "ddd", "eee"); list