目录
1.Lambda
在java 8中,lambda表达是有且只有一个抽象方法的接口 (函数式接口) 。(本质使用的,是接口中的 那个抽象方法,使用lambda表达式来实现)
java lambda -> :: Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("匿名内部类 线程启动"); }}); t1.start(); //lambda创建 Thread t2 = new Thread(()->System.out.println("线程b启动")); t2.start();
2.Stream流
stream()优点
无存储。stream不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java容器或I/O channel等。为函数式编程而生。对stream的任何修改都不会修改背后的数据源,比如对stream执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新stream。
惰式执行。stream上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。
可消费性。stream只能被“消费”一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。
3.Stream特性
- Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列。
- Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。 和以前的Collection操作不同, Stream操作还有两个基础的特征:
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格 (fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( shortcircuiting)。
- 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式,
4.Stream创建
//创建List集合 List<Integer> ln = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8, 9,11,12)); //创建Stream流 Stream<Integer> stream = ln.stream(); // 创建一个(并行流)(用于多线程) Stream<String> parallelStream = list.parallelStream(); //使用Stream静态方法创建 Stream<Integer> ss = Stream.of(1, 2, 3, 4, 5, 6); //遍历输出 ss.forEach(System.out::println); Io流创建Stream Arrays创建Stream
5.Stream使用
中间操作
filter()方法 过滤 通过Lambda
Stream<Integer> si = Stream.of(1, 2, 3, 4, 5).filter(e->e>3); System.out.println(si.count()); //输出2
map()方法
//map() 10 20 30 40 50 遍历每个元素,对这个处理并返回覆盖 Stream<Integer> si = Stream.of(1, 2, 3, 4, 5).map(e -> e * 10);
结束操作
count() 方法 返回当前流的元素个数相当于集合中的size()方法,
forEach() 方法 void forEach(Consumer action);
Stream<Integer> sss = Stream.of(1, 2, 3, 4, 5, 6); sss.forEach(System.out::println);
合用方法
List<Integer> ln = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8, 9,11,12)); Stream<Integer> stream = ln.stream(); stream.map(i -> i*i ).filter(a -> a<100).forEach(System.out::println);
......bug分析
// str.filter(a -> a<5).forEach(e -> System.out.println(e)); // str.filter(a -> a<5 ); // str.forEach(System.out::println); //filter 返回一个新流 中间操作,每次返回一个新的流,可以有多个。 Stream<Integer> stream1 = str.filter(a -> a < 5); stream1.forEach(System.out::println);