day41 jdk8新特性Stream流 数据库安装

2023-09-16 00:30:53

流(Stream)中保存了对集合或者数组数据的操作,和集合类似,但是集合中保存的是数据。Stream不能保存数据

一、创建流

  • 通过Collection对象的stream()或者parallelStream()

  • 通过Arrays类的stream(Array[]<T>)方法

  • 通过Stream接口of() iterate() generate()方法

  • 通过 IntStream, LongStream, DoubleStream接口中的of(), range(), rangeClosed()方法

 //1. 通过Collection对象的stream()或者parallelStream()
        List<String> list = new ArrayList<>();

  Stream<String> stringStream = list.parallelStream();

 //2.通过Arrays类的stream()方法
        String[] names = {"乔峰", "虚竹", "段誉", "阿朱", "段正淳", "萧远山"};
        Stream<String> stream = Arrays.stream(names);

//3.通过Stream接口of()   iterate()   generate()方法
   //     System.out.println("-----------通过Stream接口的of()--------");
        Stream<Integer> integerStream = Stream.of(10, 20, 30, 40, 50, 60); 

          Stream<Integer> iterate = Stream.iterate(0, x -> x + 2);

        Stream<Integer> generate = Stream.generate(() -> new Random().nextInt(100));

 //4.1.  通过 IntStream,  LongStream, DoubleStream接口中的of(), range(), rangeClosed()方法
        IntStream intStream = IntStream.of(10, 20, 30, 40, 50, 60, 70, 80); 

二、流的操作  

一个stream调用方法变成一个新的stream

  • filter(): 对元素数据进行过滤

  • limit(): 限制数据

  • skip(): 跳过几个元素

  • distinct(): 去重

  • sorted() 排序

  • map() 把流映射到另外一组数据

  • parallel() (parallelStream) 获取一个并行流

  • public class StreamDemo2 {
        public static void main(String[] args) {
            List<Employee> list = new ArrayList<>();
            list.add(new Employee("张无忌", 12000.0));
            list.add(new Employee("小昭", 18000.0));
            list.add(new Employee("张三丰", 32000.0));
            list.add(new Employee("金花婆婆", 15000.0));
            list.add(new Employee("宋青书", 8000.0));
            list.add(new Employee("灭绝师太", 13000.0));
            list.add(new Employee("谢逊", 27000.0));
            list.add(new Employee("成昆", 12800.0));
            list.add(new Employee("殷天正", 32000.0));
            list.add(new Employee("殷素素", 14500.0));
            list.add(new Employee("张翠山", 16900.0));
            list.add(new Employee("张松溪", 14200.0));
            list.add(new Employee("灭绝师太", 13000.0));
            list.add(new Employee("灭绝师太", 13000.0));
            list.add(new Employee("灭绝师太", 13000.0));
            list.add(new Employee("灭绝师太", 13000.0));
            list.add(new Employee("灭绝师太", 13000.0));
    
    
    
            // 1. filter 过滤   过滤出工资大于15000的员工
            Stream<Employee> employeeStream = list.stream().filter(e -> e.getSalary() > 15000);
          //  employeeStream.forEach(System.out::println);
    
            //2. limit  限制数据   取集合中的前两条数据
            Stream<Employee> limit = list.stream().limit(2);
           // limit.forEach(System.out::println);
    
            //3. skip  跳过几条数据
            Stream<Employee> skip = list.stream().skip(3);
           // skip.forEach(System.out::println);
    
            //4. distinct  去重 , 集合中的元素需要重写equals方法
            //list.stream().distinct().forEach(System.out::println);
    
    
    
            //5.sorted  排序
            //list.stream().distinct().sorted((o1,o2)-> Double.compare(o1.getSalary(),o2.getSalary())).forEach(System.out::println);
    
    
            //6. map 把流映射到另外一组数据, 提取集合中员工的名字
            list.stream().map(e->e.getName()).forEach(System.out::println);
    
            //parallel (parallelStream)    获取一个并行流    采用多线程提高效率
            list.stream().parallel().map(e->e.getName()).forEach(System.out::println);
    
    
    
    
            //练习: 找出所有姓张的,按照工资升序排序
           // list.stream().filter(e->e.getName().startsWith("张")).sorted((o1,o2)->Double.compare(o1.getSalary(),o2.getSalary()))
            //        .forEach(System.out::println);
    
            //练习2: 找出工资最低的张姓人员
    //        list.stream().filter(e->e.getName().startsWith("张"))
    //                .sorted((o1,o2)-> Double.compare(o1.getSalary(),o2.getSalary()))
    //                .limit(1).forEach(System.out::println);
    //
    
        }
    }

三、终止流

  • forEach() 遍历

  • min() 最小值

  • max() 最大值

  • count() 总数

  • reduce() 规约

  • collect() 收集

  • public class StreamDemo4 {
        public static void main(String[] args) {
            List<Employee> list = new ArrayList<>();
            list.add(new Employee("张无忌", 12000.0));
            list.add(new Employee("小昭", 18000.0));
            list.add(new Employee("张三丰", 32000.0));
            list.add(new Employee("金花婆婆", 15000.0));
            list.add(new Employee("宋青书", 8000.0));
            list.add(new Employee("灭绝师太", 13000.0));
            list.add(new Employee("谢逊", 27000.0));
            list.add(new Employee("成昆", 12800.0));
            list.add(new Employee("殷天正", 32000.0));
            list.add(new Employee("殷素素", 14500.0));
            list.add(new Employee("张翠山", 16900.0));
            list.add(new Employee("张松溪", 14200.0));
    
    
            //forEach()
            // list.stream().filter(e-> e.getName().startsWith("张")).forEach(System.out::println);
    
    
            // min()  max()
            //找出工资最低的张姓人员
            Optional<Employee> min = list.stream().filter(e -> e.getName().startsWith("张"))
                    .min((o1, o2) -> Double.compare(o1.getSalary(), o2.getSalary()));
            System.out.println(min.get());
    
            //找出工资最高的员工
            Optional<Employee> max = list.stream().max((o1, o2) -> Double.compare(o1.getSalary(), o2.getSalary()));
            System.out.println(max.get());
    
            //count()    求总数   输出员工总数
            long count = list.stream().count();
            System.out.println("员工总数:" + count);
            System.out.println(list.size());
    
            //reduce() 规约   输入数据后对数据产生某些影响 对数据进行深加工,在Stream中此方法主要用于数据的叠加
            //求公司员工工资总和
            Optional<Double> reduce = list.stream().map(e -> e.getSalary()).reduce((x, y) -> x + y);
            System.out.println(reduce.get());
    
            int[] array = {1,2,3,4,5,6,7,8,9,10};
            OptionalInt reduce1 = Arrays.stream(array).reduce((x, y) -> x + y);
            System.out.println(reduce1.getAsInt());
    
            String[] arr = {"a","b","c","d","e"};
            Optional<String> reduce2 = Arrays.stream(arr).reduce((x, y) -> x + y);
            System.out.println(reduce2.get());
    
            //collect  收集
            // 收集所有员工的姓名,收集到一个集合中
            List<String> collect = list.stream().map(e -> e.getName()).collect(Collectors.toList());
            //collect.forEach(System.out::println);
            Iterator<String> iterator = collect.iterator();
            while(iterator.hasNext()){
                String str = iterator.next();
                System.out.println(str);
            }
    
        }
    }
    

    四、新时间API

  • 之前的API存在的问题: 线程安全问题,设计混乱

  • 本地化的日期对象

    • LocalDate

    • LocalTime

    • LocalDateTime

    • Instant 时间戳

    • ZXoneld 时区

    • DateTimeFormatter 日期格式转换

  • SimpleDateFormat的线程安全问题

  •  public static void main(String[] args) throws ExecutionException, InterruptedException {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
            ExecutorService executorService = Executors.newFixedThreadPool(10);
            Callable<Date> callable = new Callable<Date>() {
                @Override
                public Date call() throws Exception {
                    return simpleDateFormat.parse("2023-09-16 12:11:11");
                }
            };
    
            List<Future<Date>> list =  new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                Future<Date> submit = executorService.submit(callable);
                list.add(submit);
            }
            for (Future<Date> dateFuture : list) {
                System.out.println(dateFuture.get());
            }
    
    
            executorService.shutdown();
        }
    /**
     * SimpleDateFormat的线程安全问题
     */
    public class DateTimeFormatterDemo {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
           //SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    
            ExecutorService pool = Executors.newFixedThreadPool(10);
            Callable<LocalDate> callable = new Callable<LocalDate>() {
                @Override
                public LocalDate call() throws Exception {
    
                   return LocalDate.parse("2023-09-15");
    
                }
            };
    
            List<Future<LocalDate>> list = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                Future<LocalDate> submit = pool.submit(callable);
                list.add(submit);
            }
    
            for (Future<LocalDate> dateFuture : list) {
                System.out.println(dateFuture.get());
            }
    
            pool.shutdown();
    
        }
    }

更多推荐

Hyper-V 虚拟机CentOS配置网络(三)

总目录https://preparedata.blog.csdn.net/article/details/132877836文章目录总目录一、创建交换机二、共享网络给交换机三、虚拟机配置交换机四、配置CentOS网络一、创建交换机二、共享网络给交换机打开物理宿主机的控制面板的网络链接中心,此时已经多了一个上一步配置好虚

通过Vue-cli搭建spa项目

🏅我是默,一个在CSDN分享笔记的博主。📚📚🌟在这里,我要推荐给大家我的专栏《Vue》。🎯🎯🚀无论你是编程小白,还是有一定基础的程序员,这个专栏都能满足你的需求。我会用最简单易懂的语言,带你走进Vue的世界,让你从零开始,一步步成为JAVA大师。🚀🏆🌈让我们在Vue的世界里畅游吧!🌈🎁如果感觉还

css前端面试题(三)

文章目录1、可继承属性和不可继承属性字体系列属性文本系列属性元素可见性列表布局属性光标属性2、link和@import的区别3、css优化4、CSS预处理器/后处理器是什么?为什么要使用它们?5、单行、多行文本溢出隐藏6、实现一个扇形7、实现一个自适应的正方形8、为什么现在的设备分辨率差异很大,2.5k屏幕都已经出现,

计算机网络 | I/O模型、网络模型(OSI七层及TCP/IP四层)

欢迎关注博主Mindtechnist或加入【LinuxC/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。I/O模型、网络模型I/O模型阻塞I/O非阻塞I/OI/

C—数据的储存(下)

文章目录前言🌟一、练习一下🌏1.例一🌏2.例二🌏3.例三🌏4.例四🌟二、浮点型在内存中的储存🌏1.浮点数🌏2.浮点数存储💫(1).二进制浮点数💫(2).浮点数的存储规定💫(3).浮点数的取出规定🌏3.例题😽总结前言👧个人主页:@小沈熬夜秃头中୧⍤⃝❅😚小编介绍:欢迎来到我的乱七八糟小星球�

计算机网络 | socket IPC(本地套接字domain)

欢迎关注博主Mindtechnist或加入【LinuxC/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。socketIPC(本地套接字domain)1.sock

[JavaScript游戏开发] 2D二维地图绘制、人物移动、障碍检测

系列文章目录第一章2D二维地图绘制、人物移动、障碍检测第二章跟随人物二维动态地图绘制、自动寻径、小地图显示(人物红点显示)第三章绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测第四章绘制Q版地图、键盘上下左右地图场景切换文章目录系列文章目录前言一、列计划1.1、目标1.2、步骤二、使用步骤2.1、准备素材(图片):草坪、人

认识 mysql 命令

文章目录1.简介2.选项3.子命令4.小结参考文献1.简介mysql是MySQL的命令行客户端,用于连接到MySQL服务器并执行SQL语句。它支持交互式和非交互式两种使用方式。以交互方式使用时,查询结果以ASCII表格式呈现。当以非交互方式使用时(例如,作为过滤器),结果以制表符分隔的格式显示。可以使用命令选项更改输出

第一个 vue-cli 项目

一、什么是vue-clivue-cli官方提供的一个脚手架,用于快速生成一个vue的项目模板;预先定义好的目录结构及基础代码,就好比咱们在创建Maven项目时可以选择创建一个骨架项目,这个骨架项目就是脚手架,我们的开发更加的快速;1.1主要的功能a、统一的目录结构b、本地调试c、热部署d、单元测试e、集成打包上线1.2

网络安全(黑客)自学

黑客,对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域,越深入越敬畏!学前感言:1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发3.有时多google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.

基于SpringBoot的旅游系统

基于SpringBoot+Vue的旅游系统、前后端分离开发语言:Java数据库:MySQL技术:SpringBoot、Vue、MybaitsPlus、ELementUI工具:IDEA/Ecilpse、Navicat、Maven【主要功能】角色:管理员、用户用户:浏览旅游新闻、景区信息、美食信息、旅游线路、在线留言、收藏

热文推荐