java 8中有两个最为重要的改变,第一个就是前面总结的Lambda表达式,另为一个则是Stream API。
这节我将总结一下!
Stream 到底是什么呢?
是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。“集合讲的是数据, Stream 讲的是计算!”
注意:
① Stream 自己不会存储元素。
② Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream .
③ Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
1、创建 Stream
一个数据源(如:集合、数组),获取一个流
2、中间操作
一个中间操作链,对数据源的数据进行处理
3、终止操作(终端操作)
一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用
public class Demo {public static void main(String[] args) {// 创建Stream的方式一:通过集合// default Stream stream():返回一个顺序流List list = new ArrayList();Stream stream1 = list.stream();// default Stream paralleStream():返回一个并行流Stream stream2 = list.parallelStream();// 创建Stream的方式二:通过数组int[] arr = new int[]{1,2,3};// 调用Arrays类的static Stream stream(T[] array):返回一个流IntStream stream = Arrays.stream(arr);// 创建Stream的方式三:通过Stream的of()Stream integerStream = Stream.of(1, 2, 3, 4);// 创建Stream的方式四:创建无限流// 迭代// public static Stream iterate(final T seed,final UnaryOperator f)// 例:遍历前10个偶数Consumer println = System.out::println;Stream.iterate(0, t -> t+2).limit(10).forEach(println);// 生成// public static Stream generate(Supplier s)Stream.generate(Math::random).limit(10).forEach(System.out::println);}
}
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为"惰性求值"
// Stream 的中间操作// 筛选与切片List list = Arrays.asList("阿牛", "小牛", "大牛", "小红");Stream stream = list.stream();// filter(Predicate p) -- 接收Lambda,从流中排出某些信息stream.filter(str -> str.contains("牛")).forEach(System.out::println); //forEach终止操作,传入一个函数式接口中的消费者
List list = Arrays.asList("阿牛", "小牛", "大牛", "小红");Stream stream1 = list.stream();// limit(n) -- 截断流,使其元素不超过给定数量stream1.limit(2).forEach(System.out::println);System.out.println("----------");Stream stream2 = list.stream();// skip(n) -- 跳过元素,返回一个人扔掉前n个元素的流,若流中元素不足n个,则返回一个空流stream2.skip(3).forEach(System.out::println);System.out.println("----------");List list1 = Arrays.asList("阿牛", "小牛", "大牛", "小红","阿牛"); // 添加一个重复元素Stream stream3 = list.stream();// distinct() -- 筛选,通过流所生成元素的hashcode()和equals()去除重复元素stream3.distinct().forEach(System.out::println);
// 映射
// map(Function f) -- 接受一个函数作为参数,这个函数应用到每个元素上,将元素映射为一个新的元素
List list = Arrays.asList("a", "b", "c", "d");
list.stream().map(str -> str.toUpperCase()).forEach(System.out::println);// flatMap(Function f) -- 接受一个函数作为参数,将流中的每个值都映射为另一个流,然后把所有的流连在一起
// 这个我不举例子了,主要可以处理结集合的嵌套,两层嵌套直接用flatMap就不用写两层forEach了
// 排序
// sorted() --自然排序
List list= Arrays.asList(12, 14, 3, 6, 10);
list.stream().sorted().forEach(System.out::println);
System.out.println("--------");
// sorted(Comparator com) --定制排序
list.stream().sorted((s1,s2) -> -Integer.compare(s1,s2)).forEach(System.out::println);
这里不再写案例!
// 归约
// reduce(T identity,BinaryOperator) - 可以将流中的元素反复结合起来,得到一个值,返回T
// T identity是初始值,BinaryOperator是函数式接口,接受T类型的两个值,返回T类型。
// 例:求1-10的和
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Integer sum = list.stream().reduce(0, Integer::sum);
System.out.println(sum); //55// reduce(BinaryOperator) - 可以将流中的元素反复结合起来,得到一个值,返回optional
// 收集// collect(Collector c)// 例:过滤列表中大于5的元素,结果返回一个ListList list = Arrays.asList(1, 2, 5, 6, 8, 7);List list1 = list.stream().filter(integer -> integer > 5).collect(Collectors.toList());System.out.println(list1);
还是比较抽象的,你们可以下去多了解了解!
如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门