首页 > 编程语言 >java8 stream详细理解

java8 stream详细理解

时间:2024-10-23 15:24:18浏览次数:6  
标签:map name stream age sex className 详细 java8

  • stream简介

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于 Lambda 表达式,极大的提高编程效率和程序可读性。

  • stream接口方法

  • 集合构建代码

import java.util.*;
import java.util.stream.Collectors;

public class TestStream {

    public static void main(String[] args) {
        List<Map<String, Object>> list1 = new ArrayList<>();
        Map<String, Object> map1 = new HashMap<>(4);
        map1.put("name", "张三");
        map1.put("age", 19);
        map1.put("className", "一班");
        map1.put("sex", "男");
        list1.add(map1);
        Map<String, Object> map2 = new HashMap<>(4);
        map2.put("name", "李四");
        map2.put("age", 20);
        map2.put("className", "一班");
        map2.put("sex", "男");
        list1.add(map2);
        Map<String, Object> map3 = new HashMap<>(4);
        map3.put("name", "王五");
        map3.put("age", 19);
        map3.put("className", "二班");
        map3.put("sex", "男");
        list1.add(map3);
        Map<String, Object> map4 = new HashMap<>(4);
        map4.put("name", "张玲");
        map4.put("age", 20);
        map4.put("className", "二班");
        map4.put("sex", "女");
        list1.add(map4);
        Map<String, Object> map5 = new HashMap<>(4);
        map5.put("name", "张盼盼");
        map5.put("age", 19);
        map5.put("className", "一班");
        map5.put("sex", "女");
        list1.add(map5);
        Map<String, Object> map6 = new HashMap<>(4);
        map6.put("name", "李冰冰");
        map6.put("age", 19);
        map6.put("className", "二班");
        map6.put("sex", "女");
        list1.add(map6);
        List<Student> list2 = new ArrayList<>();
        Student student1 = new Student("张三", 19, "一班", "男");
        list2.add(student1);
        Student student2 = new Student("李四", 20, "一班", "男");
        list2.add(student2);
        Student student3 = new Student("王五", 19, "二班", "男");
        list2.add(student3);
        Student student4 = new Student("张玲", 20, "二班", "女");
        list2.add(student4);
        Student student5 = new Student("张盼盼", 19, "一班", "女");
        list2.add(student5);
        Student student6 = new Student("李冰冰", 19, "二班", "女");
        list2.add(student6);
  }

    public static class Student {
        /**
         * 姓名
         */
        private String name;
        /**
         * 年龄
         */
        private int age;
        /**
         * 班级
         */
        private String className;
        /**
         * 行别
         */
        private String sex;

        public Student() {}

        public Student(String name, int age, String className, String sex) {
            this.name = name;
            this.age = age;
            this.className = className;
            this.sex = sex;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public String getClassName() {
            return className;
        }

        public void setClassName(String className) {
            this.className = className;
        }

        public String getSex() {
            return sex;
        }

        public void setSex(String sex) {
            this.sex = sex;
        }
    }
}
创建流:
  • stream(): 从集合创建串行流。
  • parallelStream(): 从集合创建并行流。
中间操作:
  • filter(Predicate predicate): 应用过滤器,并返回满足条件的元素。
    //filter过滤
    //班级过滤并收集成集合
    List<Map<String, Object>> filterList1 = list1.stream()
            .filter(map -> "一班".equals(map.get("className")))
            .collect(Collectors.toList());
    List<Student> filterList2 = list2.stream()
            .filter(student -> "一班".equals(student.getClassName()))
            .collect(Collectors.toList());
    输出结果: [{name=张三, className=一班, age=19, sex=男}, {name=李四, className=一班, age=20, sex=男}, {name=张盼盼, className=一班, age=19, sex=女}]
  • map(Function<? super T, ? extends R> mapper): 应用映射,将元素转换成其他形式或提取信息。
    //map映射
    //获取集合中的姓名列
    List<String> mapList1 = list1.stream()
            .map(map -> String.valueOf(map.get("name")))
            .collect(Collectors.toList());
    List<String> mapList2 = list2.stream()
            .map(Student::getName)
            .collect(Collectors.toList());
    输出结果:
    [张三, 李四, 王五, 张玲, 张盼盼, 李冰冰]
    [张三, 李四, 王五, 张玲, 张盼盼, 李冰冰]
  • mapToInt(ToIntFunction<? super T> mapper): 应用映射,将元素转换成int。
  • mapToLong(ToLongFunction<? super T> mapper): 应用映射,将元素转换成long。
  • mapToDouble(Function<? super T> mapper): 应用映射,将元素转换成double。
    //mapToInt 映射直接将字段转成int
            IntStream intStream = list1.stream().mapToInt(map -> Integer.parseInt(String.valueOf(map.get("age"))));
            int intSum = intStream.sum();
            //mapToInt 映射直接将字段转成int
            LongStream longStream = list1.stream().mapToLong(map -> Long.parseLong(String.valueOf(map.get("age"))));
            long longSum = longStream.sum();
            //mapToInt 映射直接将字段转成int
            DoubleStream doubleStream = list1.stream().mapToDouble(map -> Double.parseDouble(String.valueOf(map.get("age"))));
            double doubleSum = doubleStream.sum();
  • flatMap(Function<? super T, ? extends Stream<? extends R>> mapper): 应用映射,但是将每个元素转换成一个流,并把所有流连接成一个流。通过map映射之后是一个流数组,在使用flatMap将留数组编程一个新的流,收集到list集合
    //flatMap多个数组流连接成一个流
    List<String> stringList = Arrays.asList("Java 8 Streams", "are", "really", "easy", "to", "use");
    List<String> stringLists = stringList.stream()
            .map(word -> word.split(" "))
            .flatMap(Arrays::stream)
            .collect(Collectors.toList());
    输出结果:[Java, 8, Streams, are, really, easy, to, use]
  • distinct(): 返回去除重复元素的流。
    //distinct字符去重
    List<String> list3 = Arrays.asList("Java", "8", "Stream", "are", "are", "really", "easy", "to", "use");
    List<String> distinctList = list3.stream()
            .distinct()
            .collect(Collectors.toList());
    输出结果:[Java, 8, Stream, are, really, easy, to, use]
  • sorted(): 返回排序后的流(需要元素实现 接口)。
    //sorted排序 list<int>
    List<Integer> intList = Arrays.asList(5, 6, 4, 2, 98, 12);
    List<Integer> intLists = intList.stream()
            .sorted()
            .collect(Collectors.toList());
    输出结果:[2, 4, 5, 6, 12, 98]
  • sorted(Comparator<? super T> comparator): 返回根据比较器排序后的流。
    //sorted排序 List<Object>
    //年龄排序
    List<Map<String, Object>> sortList1 = list1.stream()
            .sorted(Comparator.comparing(map -> Integer.parseInt(String.valueOf(map.get("age")))))
            .collect(Collectors.toList());
    List<Student> sortList2 = list2.stream()
            .sorted(Comparator.comparing(Student::getAge))
            .collect(Collectors.toList());
    输出结果:[{name=张三, className=一班, age=19, sex=男},
    {name=王五, className=二班, age=19, sex=男},
    {name=张盼盼, className=一班, age=19, sex=女},
    {name=李冰冰, className=二班, age=19, sex=女},
    {name=李四, className=一班, age=20, sex=男},
    {name=张玲, className=二班, age=20, sex=女}]
  • limit(long maxSize): 返回前 n 个元素的流。
    //limit 获取数据(前n个)(注意下标越界,limit中的值小于集合数量)
    List<Map<String, Object>> limitList = list1.stream()
            .limit(2)
            .collect(Collectors.toList());
    输出结果:[{name=张三, className=一班, age=19, sex=男}, {name=李四, className=一班, age=20, sex=男}]
  • skip(long n): 跳过前 n 个元素,返回剩余元素的流。
    //skip 取数据(剩余)(注意下标越界,skip中的值小于集合数量)
    List<Map<String, Object>> skipList = list1.stream()
            .skip(2)
            .collect(Collectors.toList());
    输出结果:[{name=王五, className=二班, age=19, sex=男}, {name=张玲, className=二班, age=20, sex=女}, {name=张盼盼, className=一班, age=19, sex=女}, {name=李冰冰, className=二班, age=19, sex=女}]
  • peek(Consumer<? super T> action): 返回流,同时执行操作。
    //peek执行操作并返回结果
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    List<Integer> numberList = numbers.stream()
            .peek(n -> System.out.print("当前数据" + n))
            .map(n -> n * n)
            .collect(Collectors.toList());
    输出结果:当前数据1当前数据2当前数据3当前数据4当前数据5数的平方[1, 4, 9, 16, 25]
终端操作:
  • forEach(Consumer<? super T> action): 对流中的每个元素执行操作。
    //forEach 循环读取
            list1.stream().forEach(System.out::println);

    输出结果:

    {name=张三, className=一班, age=19, sex=男}
    {name=李四, className=一班, age=20, sex=男}
    {name=王五, className=二班, age=19, sex=男}
    {name=张玲, className=二班, age=20, sex=女}
    {name=张盼盼, className=一班, age=19, sex=女}
    {name=李冰冰, className=二班, age=19, sex=女}

  • toArray(IntFunction<A[]> generator): 返回包含流中元素的数组。
    //toArray 转数组
        List<String> list4 = Arrays.asList("Java8", "Streams", "are", "really", "easy", "to", "use");
        String[] toArray = list4.stream().toArray(String[]::new);
  • reduce(T identity, BinaryOperator accumulator): 使用给定的初始值和运算符,将流中的元素归约为一个值。
    //reduce运算
            List<Integer> list5 = Arrays.asList(4, 5, 8, 9, 3);
            Integer reduce = list5.stream().reduce(1, (acc, n) -> acc * n);
            //1 初始值;acc上次计算结果;n当前值

    输出结果:4320  

  • collect(Collector<? super T, A, R> collector): 使用收集器,将流中的元素归约为一个结果。
    //collect收集器
            //收集器中实现类型转换
            //执行流操作后转list
            List<Map<String, Object>> filterList1 = list1.stream()
                    .filter(map -> "一班".equals(map.get("className")))
                    .collect(Collectors.toList());
            List<Student> filterList2 = list2.stream()
                    .filter(student -> "一班".equals(student.getClassName()))
                    .collect(Collectors.toList());
            //List转Map
            Map<String, Map<String, Object>> listToMap1 = list1.stream().collect(Collectors.toMap(map -> String.valueOf(map.get("name")), map -> map));
            Map<String, Student> listToMap2 = list2.stream().collect(Collectors.toMap(Student::getName, student -> student));
            //List转Set
            Set<Map<String, Object>> mapSet = list1.stream()
                    .filter(map -> "一班".equals(map.get("className")))
                    .collect(Collectors.toSet());
            //收集器中实现分组
            //班级分组
            Map<Object, List<Map<String, Object>>> classNameGroup1 = list1.stream().collect(Collectors.groupingBy(map -> map.get("className")));
            Map<String, List<Student>> classNameGroup2 = list2.stream().collect(Collectors.groupingBy(Student::getClassName));
  • count(): 返回流中元素的个数。
    //count 元素个数
            List<String> list6 = Arrays.asList("Java8", "Streams", "are", "really", "easy", "to", "use");
            long count = list6.stream().count();

    输出结果:7

  • allMatch(Predicate<? super T> predicate): 检查流中的所有元素是否匹配给定的谓词。
  • anyMatch(Predicate<? super T> predicate): 检查流中的任何元素是否匹配给定的谓词。
  • noneMatch(Predicate<? super T> predicate): 检查流中的所有元素是否都不匹配给定的谓词。
    //allMatch 全满足条件
            List<Integer> list5 = Arrays.asList(4, 5, 8, 9, 3);
            boolean allMatch = list5.stream().allMatch(n -> n < 10);
            //anyMatch 部分满足条件
            boolean anyMatch = list5.stream().anyMatch(n -> n < 10);
            //noneMatch 全不满足条件
            boolean noneMatch = list5.stream().noneMatch(n -> n < 10);

    执行结果:true true false

  • findFirst(): 返回流中的第一个元素。
  • findAny(): 返回流中的任何一个元素。
    List<String> list6 = Arrays.asList("Java8", "Streams", "are", "really", "easy", "to", "use");
            //findFirst 返回第一个元素
            String first = list6.stream().findFirst().get();
            //findAny 返回任一元素
            String any = list6.stream().findAny().get();

    输出结果:Java8 Java8

  • max(Comparator<? super T> comparator): 返回流中的最大元素。
  • min(Comparator<? super T> comparator): 返回流中的最小元素。
    //max 最大值
            Map<String, Object> max = list1.stream().max(Comparator.comparing(map -> Integer.parseInt(String.valueOf(map.get("age"))))).get();
            //min 最小值
            Map<String, Object> min = list1.stream().min(Comparator.comparing(map -> Integer.parseInt(String.valueOf(map.get("age"))))).get();

    输出结果:

    {name=李四, className=一班, age=20, sex=男}
    {name=张三, className=一班, age=19, sex=男}

标签:map,name,stream,age,sex,className,详细,java8
From: https://www.cnblogs.com/wukx/p/18494491

相关文章

  • autMan奥特曼机器人对接新千寻Pro微信框架详细教程
    文件下载1、安装指定版本微信https://www.123865.com/s/3Wd9-q13jH需要的插件下载:https://pan.quark.cn/s/c1f10f726b6a2、最新千寻pro下载https://www.123865.com/s/3Wd9-Y43jH框架教程1、安装上面的指定微信版本,跟最新的千寻框架,然后启动框架双击千寻微信框架Pro......
  • 攻防演练蓝队主要工作内容(非常详细),零基础入门到精通,看这一篇就够了_网络安全攻防前期
    前言蓝队,是指网络实战攻防演习中的防守一方。蓝队一般是以参演单位现有的网络安全防护体系为基础,在实战攻防演习期间组建的防守队伍。蓝队的主要工作包括演习前安全检查、整改与加固,演习期间进行网络安全监测、预警、分析、验证、处置,后期复盘总结现有防护工作中的不足之......
  • 《坚守阵地2》遇到steamclient.dll缺失?解决《坚守阵地2》中steamclient.dll文件缺失详
    当《坚守阵地2》遇到steamclient.dll缺失的问题时,可以尝试以下详细的修复步骤来解决:一、验证游戏文件完整性打开Steam客户端。在游戏库中找到《坚守阵地2》。右键点击游戏图标,选择“属性”。在“本地文件”选项卡中,点击“验证游戏文件的完整性”。等待Steam检查并修复游戏文......
  • 使用Llama Index与Streamlit实现一个从文本中提取专业术语和定义网页小程序
    LlamaIndex有很多文档完备的用例(语义搜索、摘要等)。然而,这并不意味着我们不能将LlamaIndex应用到非常具体的用例中!在本教程中,我们将介绍使用LlamaIndex从文本中提取术语和定义的设计过程,同时允许用户稍后查询这些术语。使用Streamlit,我们可以提供一种简单的方法来构建用......
  • 【网络安全零基础入门】Linux安全加固(非常详细)零基础入门到精通,收藏这一篇就够了
    大家好,我是画画的小强。今天将继续带大家入门网络安全linux系统篇安全加固教程,全程干货,建议收藏哈安全加固方案原则1.版本升级对于系统和应用在使用过程中暴露的安全缺陷,系统或应用厂商会及时发布解决问题的升级补丁包。升级系统或应用版本,可有效解决旧版本存在的安全......
  • 超详细的Stable Diffusion(SD)本地部署教程,小白一看就会。
    前言一、StableDiffusion是什么?简单来讲,StableDiffusion(简称SD)是一款AI自动生成图片的软件。我们输入文字,SD就能生成相应的图片,不再像过去那样需要把图片“画”出来或者“拍”出来。有人说,我在学习一个软件之前是不是得先了解它的原理呢?所有的AI设计工具,安装包......
  • 华为eNSP全面教学指南——从基础到实践,附带详细代码案例
    华为eNSP全面教学指南——从基础到实践,附带详细代码案例引言华为eNSP(EnterpriseNetworkSimulationPlatform)是一款功能强大的网络模拟工具,它允许用户在虚拟环境中配置、测试和优化网络设备。本博客旨在为新手提供一个全面、系统的学习路径,通过详细讲解每个命令并附带代......
  • 6个黑客教程网站,小白也能成大牛!(非常详细)零基础入门到精通,收藏这一篇就够了
    黑客攻击是一项很难掌握的技能,在很大的程度上要求人们对计算机和软件架构的各种概念和网络系统有深入的了解。一般而言,黑客主要有两种:黑帽黑客、白帽黑客。黑帽黑客为了个人利益,利用自身的计算机系统知识侵入系统,这种做法是违法的,需要负法律责任;而白帽黑客则是利用相同的......
  • 六种概率数据结构的详细解释及应用场景
    1/BloomFilter用途:测试一个元素是否可能在一个集合中。原理:BloomFilter使用多个哈希函数将元素映射到一个位数组上。如果所有对应的位都被设置为1,则认为该元素可能在集合中。优点:非常节省空间,因为不需要存储实际的元素,只需存储位图信息。应用:在数据库查询优化、网页缓......
  • Thymeleaf模板引擎教程(详细总结)
    Thymeleaf是一个服务器端Java模板引擎,能够处理HTML、XML、CSS、JAVASCRIPT等模板文件。Thymeleaf模板可以直接当作静态原型来使用,它主要目标是为开发者的开发工作流程带来优雅的自然模板,也是Java服务器端HTML5开发的理想选择。1.创建模......