4.Stream
4.1介绍
流(Stream)是数据管道,用于操作数据源(集合、数组等)说生成的元素序列,集合说的是数据,而流指的是计算
特点:
1.不存储数据
2.不改变源对象,每次操作返回一个持有结果的请Stream
3.延迟执行,需要结果的时候才执行
4.2 使用
1.创建数据源,获取一个流
2.中间操作,对数据进行处理
3.终止操作,产生结果
4.3 举个栗子
//1.通过Collection 系列集合提供的stream() 或 parallelStream()
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
Stream<String> stream2 = list.parallelStream();
//2.通过Arrays 中的静态方法stream() 获取数组流
Integer [] integers = new Integer[10];
Stream<Integer> stream3 = Arrays.stream(integers);
//3.通过Stream 类中的静态方法of()
Stream<String> stream4 = Stream.of("a", "b", "c");
//4. 创建无限流
Stream<Integer> stream5 = Stream.iterate(0, (x) -> x + 2);
4.4 中间操作
多个中间操作可以连接成一个类似于流水线的场景,如果不碰到终止操作,中间操作不会进行任何处理,而在终止操作时一次性全部处理,简称 “惰性求值”
4.4.1 筛选和切片
filter-----》接收 lambda,从流中筛出某些元素
limit(n)------》截断流,使其不超过给定数量
skip(n)-------》跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流
distinct------》通过筛选流中的元素的hashcode和equals去除重复元素
@Test
public void test2(){
List<Integer> list = Arrays.asList(10 ,20, 20 , 50 , 60 , 70 , 80);
System.out.println("------filter----------");
list.stream().filter( x-> x>10).forEach(System.out::println);
System.out.println("------limit-----------");
list.stream().limit(2).forEach(System.out::println);
System.out.println("------skip------------");
list.stream().skip(2).forEach(System.out::println);
System.out.println("------distinct------------");
list.stream().distinct().forEach(System.out::println);
}
4.4.2 映射
map----》接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会应用到每个元素上,
并将其映射成一个新的元素
flatMap---》接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
@Test
public void test3(){
List<String> list = Arrays.asList("aaa" ,"bbb" ,"ccc" ,"d" ,"e");
Stream<String> stringStream = list.stream().map(str -> str.toUpperCase());
list.stream().flatMap(StreamTest::getList).forEach(System.out::print);
}
public static Stream<Character> getList(String str){
List<Character> list = new ArrayList<>();
for (Character character : str.toCharArray()) {
list.add(character);
}
return list.stream();
}
4.4.3排序
排序
sorted()--自然排序
sorted(Comparator com) --定制排序
@Test
public void test4(){
List<Integer> list = Arrays.asList(10 ,20, 20 , 50 , 60 , 70 , 80);
list.stream().sorted().forEach(x-> System.out.print(x + ","));
list.stream().sorted((o1 ,o2)-> -Integer.compare(o1 , o2)).forEach(x-> System.out.print(x + ","));
}
4.5 终止操作
4.5.1 查找与匹配
allMatch--检查是否匹配所有元素
angMatch--检查是否至少匹配一个元素
noneMatch--检测是否没有匹配所有元素
findFirst--返回第一个元素
findAny--返回当前流中的任意元素
count--返回总数
max--返回流中最大值
min--返回流总最小值