Stream流简析
1.概述:
1.1 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
1.2 数据源 流的来源。 可以是集合,数组等。
1.3 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
2.Stream的操作三个步骤
2.1 创建Stream
一个数据源(如:集合、数组),获取一个流
2.2 中间操作
一个中间操作链,对数据源的数据进行处理
2.3 终止操作
一个终止操作,执行中间操作链,并产生结果
创建Stream方法演示:
// 通过集合获取一个和集合对接的Stream
List list=new ArrayList<>();
list.add("aaaa");
list.add("bbbb");
// 利用集合本身提供的方法获取对应Stream
Stream stream = list.stream();
// 获取一个并行流
Stream parStream = list.parallelStream();
// 利用数组提供的方式 获取对应的Stream
Integer[] num=new Integer[10];
Stream<Integer> arrStream = Arrays.stream(num);
// Stream中提供了一个静态方法 of 可以将数组或者集合 的元素排列成一个流
Stream<Integer> streamNum = Stream.of(num);
中间操作演示:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class DemoTestStreamOper {
public static void main(String[] args) {
// 通过集合获取一个和集合对接的Stream
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbbb");
list.add("cccccc");
list.add("ddddddd");
list.add("eeeeeeeee");
//创建Stream流
Stream<String> stream = list.stream();
//打印那些字符个数大于5的字符串元素
// 流不存储数据,一次就过
// 正常写法
list.stream().filter(t->t.length()>5).forEach(t-> System.out.println(t));
// 方法引用
list.stream().filter(t->t.length()>5).forEach(System.out::println);
// 获取一个并行流
list.parallelStream().forEach(t-> System.out.println(t));
// limit截断流 截下指定个数的元素
list.stream().limit(3).forEach(System.out::println);
//跳过 跳过指定个数 从指定个数的下一个数开始
list.stream().skip(2);
// 去重 distinct 去掉所有重复的
list.stream().distinct().forEach(System.out::println);
//排序 按照正序排序 Comparator接口
// int compare(T o1, T o2);方法实现
//这个方法返回值是int类型,
// 如果返回值小于0,说明比较结果是o1<o2,正序排序
// 如果返回值等于0,说明比较结果是o1=o2,
// 如果返回值大于0,则说明比较结果是o1>o2。逆序排序
list.stream().sorted((t1, t2)->{
// 比较规则
return t1.length()-t2.length();
}).forEach(System.out::println);
}
}
多个方法之间可以互相结合,实现更能的功能。
比如:向获取集合中的第四个值,可以先用ski(3)方法跳过前三个值,用limit(1)方法截取1个值,从而获得第四个值。
终止操作演示:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class DemoTestStreamFinal {
public static void main(String[] args) {
// 通过集合获取一个和集合对接的Stream
List<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbbb");
list.add("cccccc");
list.add("ddddddd");
list.add("eeeeeeeee");
// 判断|查看 集合中的元素字符个数是否都大于3个 allMatch()方法,是否全部匹配
System.out.println(list.stream().allMatch(t -> t.length() > 3));
// 判断|查看 集合中的元素字符个数是否存在大于3个字符的情况 anyMatch() 存在
System.out.println(list.stream().anyMatch(t -> t.length() > 3));
// 判断|查看 集合中的元素字符个数是否不存在大于3个字符的情况 noneMatch() 没有
System.out.println(list.stream().noneMatch(t -> t.length() > 3));
//查找任意一个,一般和并行流一起使用
System.out.println(list.stream().findAny().get());
System.out.println(list.parallelStream().findAny().get());
//统计元素的个数
System.out.println(list.stream().filter(t->t.length()>3).count());
//查找最大值
System.out.println(list.stream().max((t1, t2) -> {
return t1.length() - t2.length();
}).orElse("None"));
System.out.println("---------");
//遍历集合中每个元素的长度
list.stream().map(t->t.length()).collect(Collectors.toList()).forEach(System.out::println);
}
}
注意:
1、Stream自己不会存储元素·
2、Stream不会改变源对象。相反,会返回一个持有结果的新Stream。
3、Stream操作是延迟执行的,这意味着他们会等到需要结果的时候才执行。