一、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排序器。

认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)_后端

消费

Peek:如同与map,能得到流中的每一个元素。但map接收的是一个Function表达式,有返回值;而peek接收的是Consumer表达式,没有返回值。

认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)_开发语言_02

四、流的终止操作

认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)_后端_03

认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)_字符串分割_04

认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)_迭代_05

认真阅读完这篇文章熟练掌握Stream流的基本应用(创建方法,中间操作,终止操作)_字符串分割_06