参考:https://blog.csdn.net/y_k_y/article/details/84633001
一、概述
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
二、分类
stream操作分类
|
中间操作
|
无状态
(Statusless)
|
filter()
map() mapToInt() mapToLong() mapToDouble()
flatMap() flatMapToInt()
flatMapToLong() flatMapToDouble()
unordered() pee()
|
有状态
(Statusful)
|
distinct() sorted() limit() skip()
|
结束操作
|
非短路操作
|
foreach() forEachOrdered()
toArray() toList() collect()
max() min() count()
|
短路操作
|
anyMatch() allMatch() noneMatch()
findFirst() findAny()
|
解释:
无状态:指元素的处理不受之前元素的影响;
有状态:指该操作只有拿到所有元素之后才能继续下去。
非短路操作:指必须处理所有元素才能得到最终结果;
短路操作:指遇到某些符合条件的元素就可以得到最终结果,如 A || B,只要A为true,则无需判断B的结果
三、具体用法
- 创建流
- 使用Array中的stream()方法
String[] arr = {"1", "3", "2", "5", "1" };
Stream<String> stream1=Arrays.stream(arr);
- 使用Stream中的静态方法:of()、iterate()、generate()
Stream<Integer> stream = Stream.of(1,2,3,4,5,6);
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x 2).limit(6);
stream2.forEach(System.out::println); // 0 2 4 6 8 10
Stream<Double> stream3 = Stream.generate(Math::random).limit(2);
stream3.forEach(System.out::println);
- 使用 BufferedReader.lines() 方法,将每行内容转成流
BufferedReader reader = new BufferedReader(new FileReader("F:\\test_stream.txt"));
Stream<String> lineStream = reader.lines();
lineStream.forEach(System.out::println);
- 使用 Pattern.splitAsStream() 方法,将字符串分隔成流
Pattern pattern = Pattern.compile(",");
Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);
- 流的中间操作
- 筛选和切片
- filter:filter的使用方式为: filter(item -> item的逻辑判断 ) ,其中filter会保留判断条件为true的记录
- distinct():去除重复元素
- sorted():对流中的元素排序
- limit(n):获取n个元素
- skip():跳过n个元素
Integer[] arr = {6, 3, 7, 3, 6,11,9, 10};
List<Integer> list = Arrays.asList(arr);
List<Integer> newlist = new ArrayList<>(list);
List<Integer> sList = newlist.stream()
.filter(ele -> ele>5) // {6,7,6,11,9,10}
.distinct() // {6,7,11,9,10}
.sorted() // {6,7,9,10,11}
- 映射
- map:map方法用于映射每个元素到对应的结果
# 输出元素对应的平方数
Integer[] arr = {1,2,3,4,5};
List<Integer> list = Arrays.asList(arr);
List<Integer> newlist = new ArrayList<>(list);
Stream<Integer> stream= newlist.stream()
.map(i ->i*i);
stream.forEach(System.out::println); // {1,3,9,16,25}
来源:https://www./content-1-657251.html
|