参考: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的结果
三、具体用法
- 创建流
- 使用Collection下的stream() 和 parallelStream() 方法
List<String> list=new ArrayList<>(); // .stream()获取一个顺序流 Stream<String> stream=list.stream(); // .parallelStream()获取一个并行流 Stream<String> parallelStream=list.parallelStream();
- 使用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);
- 使用Collection下的stream() 和 parallelStream() 方法
- 流的中间操作
- 筛选和切片
- 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}
- map:map方法用于映射每个元素到对应的结果
- 筛选和切片