一、Stream流技术
1、Stream(流)是一个来自数据源的元素队列并支持聚合操作
2、元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
3、数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
4、聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
5、和以前的Collection操作不同, Stream操作还有两个基础的特征:
①Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( shortcircuiting)。
②内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
二、流的常用创建方法
使用Stream中的静态方法:of()、iterate()、generate()创建流
//使用Stream中的静态方法:of()、iterate()、generate()。都是创建流的方法
var s1 = Stream.of(1, 2, 3);
s1.forEach(System.out::println);
var s2 = Stream.generate(() -> "ok").limit(5);
s2.forEach(System.out::println);
var s3 = Stream.iterate(1, (a) -> a + 2).limit(5);
s3.forEach(System.out::println);
使用Arrays 中的 stream() 方法,将数组转成流
//将Integer[]转为Stream类型
Integer[] integer = new Integer[10];
Stream<Integer> stream = Arrays.stream(integer);
使用lines方法将文件内容按行转成流
//将文件内容按行转成流
BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\abc.txt"));
Stream<String> stream = bufferedReader.lines();
stream.forEach(System.out::println);
String sg = "D:\\idea\\A2\\src\\main\\java\\Check.java";
File file = new File(sg);
try (BufferedReader bf = new BufferedReader(new FileReader(file))) {
var i = new AtomicInteger();
bf.lines().forEach(e -> System.out.printf("%02d、 %s%n", i.getAndIncrement(), e));
}
将字符串分割成流
//将字符串分割成流
//lombda表达式
Pattern p = Pattern.compile("[+]");
//将-替换成+-
String str = "1+2+3-5-1+9".replace("-", "+-");
//以+号分割字符串
p.splitAsStream(str).forEach(System.out::println);
三、流的中间操作
filter:过滤流中的某些元素
limit:获取N个元素
skip:跳过n个元素开始,配合limit可以实现分页
distinct:通过流中的hashCode()和equals()去除重复元素
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 6, 11, 23, 33);
Stream<Integer> stream1 = stream.filter(a -> a > 5)//筛选出比5大的数
.distinct()//去除重复的数
.skip(2)//跳过两位元素
.limit(3);//最多输出三个元素
stream1.forEach(System.out::println);
映射:
map:接收一个函数作为参数,该函数被应用到每个元素上,并将其映射成一个新元素。
flatmap:接收一个函数作为参数,将流中的每一个值都替换成另一个流,然后把所有流连成一个流。
//使用map函数将元素中的,替换
List<String> list1 = new ArrayList<String>();
list1.add("a,s,c");
list1.add("1,2,3,4");
Stream<String> stream = list1.stream().map(s -> s.replaceAll(",", ""));
stream.forEach(System.out::println);
//使用flatmap函数将元素中的,去除
List<String> list1 = new ArrayList<String>();
list1.add("a,s,c");
list1.add("1,2,3,4");
Stream<String> stream1 = list1.stream().flatMap(s -> {
String[] st = s.split(",");
Stream<String> stream2 = Arrays.stream(st);
return stream2;
});
stream1.forEach(System.out::println);
排序:
sorted:自然排序,流中的元素需要实现comparatorble接口。
sorted(COmparator com):定制排序,自定义comparator com排序器。
消费:
Peek:如同与map,能得到流中的每一个元素。但map接收的是一个Function表达式,有返回值;而peek接收的是Consumer表达式,没有返回值。