Stream是一组用来处理数组、集合的API
▪ Java 8之所以费这么大功夫引入函数式编程,原因有二:
– 代码简洁函数式编程写出的代码简洁且意图明确,使用 stream 接口让你从此告别 for 循环。
– 多核友好,Java函数式编程使得编写并行程序从未如此简单,你需要的全部就是调用一下parallel()方法。
1:不是数据结构,没有内部存储
2:不支持索引访问
3:延迟计算
4:支持并行
5:很容易生成数组或集合(List,Set)
6:支持过滤,查找,转换,汇总,聚合等操作
Stream分为 源source,中间操作,终止操作
流的源可以是一个数组、一个集合、一个生成器方法,一个I/O通道等等。
一个流可以有零个和或者多个中间操作,每一个中间操作都会返回
一个新的流,供下一个操作使用。一个流只会有一个终止操作
Stream只有遇到终止操作,它的源才开始执行遍历操作
1、通过数组
2、通过集合来
3、通过Stream.generate方法来创建
4、通过Stream.iterate方法来创建
5、其他API创建
import java.util.Arrays; import java.util.List; import java.util.stream.IntStream; import java.util.stream.Stream; public class StreamDemo { //通过数组来生成 static void gen1(){ String[] strs = {"a","b","c","d","e"}; Stream<String> strs1 = Stream.of(strs); strs1.forEach(System.out::println); } //通过集合来生成 static void gen2(){ List<String> list = Arrays.asList("1","2","3","4"); Stream<String> stream = list.stream(); stream.forEach(System.out::println); } //generate static void gen3(){ Stream<Integer> generate = Stream.generate(()->1); generate.limit(10).forEach(System.out::println); } //iterator static void gen4(){ Stream<Integer> iterate = Stream.iterate(1, x -> x + 1); iterate.limit(10).forEach(System.out::println); } //其他方式 static void gen5(){ String str = "abcdef"; IntStream stream = str.chars(); stream.forEach(System.out::println); } public static void main(String[] args) { // gen1(); // gen2(); // gen3(); // gen4(); gen5(); } }
中间操作
过滤 filter
去重 distinct
排序 sorted
截取 limit、skip
转换 map/flatMap
其他 peek
终止操作
循环 forEach
计算 min、max、count、 average
匹配 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny
汇聚 reduce
收集器 toArray collect
import java.util.Arrays; import java.util.List; import java.util.Optional; public class Stream1 { public static void main(String[] args) { // List<Integer> list = Arrays.asList(5,4,3,2,1); //注意,如果调用方法返回的是一个Stream对象,那就是中间操作 Arrays.asList(5,4,3,2,1).stream().filter((x)->x%2==0).sorted().forEach(System.out::println); //求出结果中所有偶数的和 //mapToInt:转为IntStream类型 int sum = Arrays.asList(5, 4, 3, 2, 1).stream().filter((x) -> x % 2 == 0).mapToInt(x -> x).sum(); System.out.println(sum); //求集合中的最大值 List<Integer> list = Arrays.asList(5, 4, 3, 2, 1); Optional<Integer> max = list.stream().max((a, b) -> a - b); System.out.println(max.get()); } }