java8新特性——Stream

一.stream介绍

stream(流)是一个来自数据源的元素队列

集合讲的是数据,而流讲的是计算

注意:

①stream自己不会存储元素

②stream不会改变源对象,相反他会返回一个持有结果的新stream

③stream操作是延时执行的,这意味着他们会等到需要结果的时候才执行

stream操作的三个步骤

①创建stream

    //1.通过Collection 系列集合提供的stream()[串行流]或 [并行流]来生成流
        List list = new ArrayList();
        Stream stream = list.stream();

        //2.通过Arrays中的静态方法stream()获取数据流
        String[] arr = new String[10];
        Stream<String> stream1 = Arrays.stream(arr);

        //3.通过Stream类中的静态方法of()
        Stream<String> aa = Stream.of("aa", "bb", "cc");//4.创建无限流
        //迭代
        Stream<Integer> iterate = Stream.iterate(0, (x) -> x + 2);//生成
        Stream.generate(() -> Math.random());

②中间操作

        List list = List.of("aa","bb","cc","aa");
        //1.filter 排除某些元素
        // 将内容为"aa"的元素排除
        list.stream().filter( (str)-> !str.equals("aa")).forEach(System.out::println);

        //2.limit 截断流,使其元素不超过给定数量
        // 取两个元素
        list.stream().limit(2).forEach(System.out::println);

        //3.skip 跳过元素,返回一个扔掉了前n个元素的流
        // 跳过两个元素
        list.stream().skip(2).forEach(System.out::println);

        //4.distinct 筛选,通过流生成元素的hashCode()和equals()去除重复元素
        list.stream().distinct().forEach(System.out::println);

        //5.map 映射,将元素转换成其他形式或提取信息。接受一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
        //将流中的元素全部转换成大写
        Stream<String> string = list.stream();
        string.map((str) -> str.toUpperCase()).forEach(System.out::println);

        //6.flatMap  接受一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
        List<List<String>> list02 = new ArrayList();
        list02.add(list);
        list02.add(list);
        /**
         *  现在list里的数据为[ ["aa","bb","cc","aa"],["aa","bb","cc","aa"] ]
         *  如果用map映射的话 stream流里的结构是 { {"aa","bb","cc","aa"},{"aa","bb","cc","aa"} }的
         *  如果用flatmap映射的话 stream流里的结构就是 {"aa","bb","cc","aa","aa","bb","cc","aa" }的
         */
        Stream<List<String>> stringStream = list02.stream();
        stringStream.map((lst) -> lst.stream().map((str) -> str.toUpperCase()));

        /**
         * 7.排序
         * sorted()  自然排序,就是用Comparable的方式取排
         * sorted(Comparator com)  自定义排序
         */
         //自然排序
         List list03 = List.of("hh","b","cccc","aaa");
         list03.stream().sorted().forEach(System.out::println);
         //结果: aaa  b  cccc  hh

         //自定义按照长度排序
         Stream<String> stringStream1 = list03.stream();
         stringStream1.sorted((str1,str2) -> str2.length()-str1.length()).forEach(System.out::println);
         //结果: cccc aaa hh b

  

③终止操作

每当终止语句执行后,这个流就会关闭

     /**
         * allMatch  检查是否所有元素都符合匹配条件
         * anyMatch  检查是否至少有一个元素符合匹配条件
         * noneMatch  检查是否没有元素匹配条件
         * findFirst  返回第一个元素
         * findAny  返回当前流中的任意元素
         * count  返回流中元素的个数
         * max  返回流中最大值
         * min  返回流中最小值
         * reduce(T identity,BinaryOperator) /reduce(BinaryOperator) 将流中元素反复结合起来,得到一个值
         * collect  收集,将流转换为其他形式,接收一个Conllector接口的实现,用于给stream中元素做汇总的方法
         */

        //allMatch,anyMatch,noneMatch
        List list = List.of("aa","bbb","c","dddd");
        Stream<String> stringStream = list.stream();
        //检查元素是否长度都大于5
        boolean b = stringStream.anyMatch((str) -> str.length() > 5);
        System.out.println(b);
        //结果为: false

        //count
        Stream<String> stringStream02 = list.stream();
        //取得元素长度
        long count = stringStream02.count();
        System.out.println(count);
        //结果为: 4

        //findFirst
        Stream<String> stringStream03 = list.stream();
        //取得第一个元素
        Optional<String> op = stringStream03.findFirst();
        //Optional 是一个java容器,具体不在此解释
        System.out.println(op.get());
        //结果为: aa

        //findAny
        Stream<String> stringStream04 = list.stream();
        Stream<String> stringStream05 = list.parallelStream();
        //取得任意元素
        //如果是parallelstream()并行流 就会多个线程去获取,结果会随机
        //但如果是stream()串行流 就只能获取第一个
        Optional<String> any = stringStream04.findAny();
        System.out.println(any.get());
        System.out.println(stringStream05.findAny().get());

        //max
        //取得流中长度最大值
        Stream<String> stringStream06 = list.stream();
        Optional<String> max = stringStream06.max(String::compareTo);
        System.out.println(max.get());

        //reduce
        //将流中所有字符串拼接
        Stream<String> stringStream07 = list.stream();
        Stream<String> stringStream08 = list.stream();
        //因为这个设置了起始值"" 避免了空指针, 所以结果为String类型
        String reduce = stringStream07.reduce("",String::concat);
        System.out.println(reduce);
        //这个没有起始值, 所以返回值类型为Optional
        Optional<String> reduce1 = stringStream08.reduce(String::concat);

        //collect
        //将流转换为容器list
        Stream<String> stringStream09 = list.stream();
        List<String> collect = stringStream09.collect(Collectors.toList());
        System.out.println(collect);
        //如果要转换成arraylist则需要Collectors.toCollection来转
        Stream<String> stringStream10 = list.stream();
        ArrayList<String> collect1 = stringStream10.collect(Collectors.toCollection(ArrayList::new));
        System.out.println(collect1);
        //Collectors里面有很多方法,比如求和,平均值,分组,多级分组,分区等很多灵活操作

  

原文地址:https://www.cnblogs.com/licha233/p/12693244.html

时间: 2024-10-03 10:47:49

java8新特性——Stream的相关文章

Java8 新特性 Stream 无状态中间操作

无状态中间操作 Java8 新特性 Stream 练习实例 中间无状态操作,可以在单个对单个的数据进行处理.比如:filter(过滤)一个元素的时候,也可以判断,比如map(映射)... 过滤 filter 映射 map 扁夹化 flatMap 遍厉 peek 过滤 filter 接收一个谓词断言,boolean Pridicate< T > 根据返回值类型来确定是否过滤这一条属性. // 过滤 filter @Test public void filterTest() { list.stre

Java8 新特性 Stream 短路终端操作

短路终端操作 Java8 新特性 Stream 练习实例 传入一个谓词,返回传为boolean,如果符合条件,则直接结束流. 匹配所有 allMatch 任意匹配 anymMatch 不匹配 noneMatch 查找首个 findFirst 查找任意 findAny 匹配所有 allMatch //匹配所有 allMatch @Test public void allMatchTest() { boolean b = list.stream() //所有的商品价格都大于40 .allMatch(

Java8 新特性 Stream 非短路终端操作

非短路终端操作 Java8 新特性 Stream 练习实例 非短路终端操作,就是所有的元素都遍厉完,直到最后才结束.用来收集成自己想要的数据. 方法有: 遍厉 forEach 归约 reduce 最大值 max 最小值 min 聚合 collect 计数 count 遍厉 forEach //遍厉 forEach @Test public void forEachTest() { list.stream() .forEach(iter -> //以json格式输出 System.out.prin

java8 新特性 Stream

1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的Iterator.原始版本的Iterator,用户只能一个一

Java8新特性Stream API与Lambda表达式详解(1)

1 为什么需要Stream与Lambda表达式? 1.1  为什么需要Stream Stream作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream.Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利.高效的聚合操作(aggr

Java8新特性 --Stream

一. 创建Stream 创建Stream方式一: 集合类的stream()或 parallelStream() java List<String> list = new ArrayList<>(); Stream<String> stream = list.stream(); 创建Stream方式二: 通过Arrays中的静态方法stream()获取 String[] strings = new String[10]; Stream<String> stre

Java8新特性——stream流

一.基本API初探 package java8.stream; import java.util.Arrays; import java.util.IntSummaryStatistics; import java.util.List; import java.util.Random; import java.util.stream.Collectors; import java.util.stream.IntStream; /** * @author [email protected] * @

java8 新特性 Stream流 分组 排序 过滤 多条件去重

private static List<User> list = new ArrayList<User>(); public static void main(String[] args) { list = Arrays.asList( new User(1, "a", 10), new User(4, "d", 19), new User(5, "e", 13), new User(2, "b", 1

Java8 新特性 Stream() 创建流

通过Controllere类的Stream()和parallelStream()创建流 //通过集合创建流 @Test public void test1() { String arr[] = new String[]{"a", "b", "c"}; //把数组转换成集合 List<String> list = Arrays.asList(arr); //生成stream流(串行流) Stream<String> stre