首页 > 编程语言 >Java8实战笔记(四)

Java8实战笔记(四)

时间:2024-11-15 10:17:37浏览次数:3  
标签:实战 Optional 笔记 public DateTimeFormatter LocalDateTime date LocalDate Java8

一、并行数据处理与性能

  1. 并行流

    • 通过对收集源调用parallelStream方法来把集合转换为并行流。并行流就是一个把内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

      // 返回从1到给定参数n的所有数字之和
      // 顺序流
      public static long sequentialSum(long n) {
          return Stream.iterate(1L, i -> i + 1) // 生成自然数无限流
              .limit(n) // 限制到前n个数
              .reduce(0L, Long::sum); // 对所有数字求和来归纳流
      }
      
      // 并行流
      public static long sequentialSum(long n) {
          return Stream.iterate(1L, i -> i + 1)
              .limit(n)
              .parallel() // 将流转换为并行流
              .reduce(0L, Long::sum);
      }
      
    • 对顺序流调用parallel方法并不意味着流本身有任何实际的变化,对并行流调用sequential方法就可以把它变成顺序流。也可以把这两个方法结合起来,可以更细化地控制在遍历流时哪些操作要并行执行,哪些要顺序执行

      stream.parallel()
          .filter(...)
          .sequential()
          .map(...)
          parallel()
          .reduce();
      

二、用Optional取代null

  1. Optional类:变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个“空” 的Optional对象,由方法Optional.empty()返回。Optional.empty()方法是一个静态工厂方法,它返回Optional类的特定单一实例。

    // 人可能有车,也可能没有车,使用Optional可以避免空指针异常
    public class Person {
        private Optional<Car> car;
        public Optional<Car> getCar() {
            return car;
        }
    }
    
    public class Car {
        private Optional<Insurance> insurance; 
        public Optional<Insurance> getInsurance() { 
            return insurance; 
        }
    }
    
    public class Insurance { 
        private String name;  // 保险公司必须有名字
        public String getName() { 
            return name; 
        }
    }
    
  2. 应用Optional 的几种模式

    • 声明空的Optional

      Optional<Person> optPerson = Optional.empty();
      
    • 依据一个非空值创建Optional

      // 如果person是一个null,这段代码会立即抛出一个NullPointerException
      Optional<Person> optPerson = Optional.of(person);
      
    • 可接受null的Optional

      // 使用静态工厂方法Optional.ofNullable,你可以创建一个允许null值的Optional对象,如果person是null,那么得到的Optional对象就是个空对象。
      Optional<Person> optPerson = Optional.ofNullable(person);
      
    • 使用map从Optional对象中提取和转换值

      Optional<Insurance> optInsurance = Optional.ofNullable(insurance);
      Optional<String> name = optInsurance.map(Insurance::getName)
      
    • 使用flatMap链接Optional 对象

      // 使用Optional获取car的Insurance名称
      public String getCarInsuranceName(Optional<Person> person) {
          return person.flatMap(Person::getCar)
              .flatMap(Car::getInsurance)
              .map(Insurance::getName)
              .orElse("unknown");
      }
      

      image-20241113150505179

    • 默认行为及解引用Optional对象

      ① get():如果变量存在,它直接返回封装的变量 值,否则就抛出一个NoSuchElementException异常。

      ② orElse((T other):允许在Optional对象不包含值时提供一个默认值。

      ③ orElseGet(Supplier<? extends T> other):是orElse方法的延迟调用版,Supplier 方法只有在Optional对象不含值时才执行调用。

      ④ orElseThrow(Supplier<? extends X> exceptionSupplier):在Optional对象为空时都会抛出一个异常,但是使用orElseThrow你可以定制希 望抛出的异常类型。

      ⑤ ifPresent(Consumer):在变量值存在时执行一个作为参数传入的 方法,否则就不进行任何操作。

    • 使用filter剔除特定的值:filter方法接受一个谓词作为参数。如果Optional对象的值存在,并且它符合谓词的条件, filter方法就返回其值;否则它就返回一个空的Optional对象

      // 检查保险公司的名称是否为“Cambridge-Insurance”
      Optional<Insurance> optInsurance = ...; 
      optInsurance.filter(insurance -> "CambridgeInsurance".equals(insurance.getName())) 
                  .ifPresent(x -> System.out.println("ok")); 
      
  3. Optional类的方法总结

    image-20241113154204839

    三、新的日期和时间API

    1. LocalDate:该类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。另外,它也不附带任何与时区相关的信息。

      // 创建一个LocalDate对象并读取其值 
      LocalDate date = LocalDate.of(2014, 3, 18);
      int year = date.getYear();
      Month month = date.getMonth();
      int day = date.getDayOfMonth();
      DayOfWeek dow = date.getDayOfWeek();
      // 当前月的天数
      int len = date.lengthOfMonth();
      // 是否是闰年
      boolean leap = date.siLeapYear();
      
      // 获取当前日期
      LocalDate today = LocalDate.now();
      
    2. LocalTime

      LocalTime time = LocalTime.of(13, 45, 20); 
      int hour = time.getHour();  
      int minute = time.getMinute(); 
      int second = time.getSecond(); 
      
      // 获取当前时间
      LocalTime now = LocalTime.now()
      
    3. LocalDateTime

      // 2014-03-18T13:45:20 
      LocalDateTime dt1 = LocalDateTime.of(2014, Month.MARCH, 18, 13, 45, 20); 
      LocalDateTime dt2 = LocalDateTime.of(date, time); 
      LocalDateTime dt3 = date.atTime(13, 45, 20); 
      LocalDateTime dt4 = date.atTime(time); 
      LocalDateTime dt5 = time.atDate(date); 
      
      // 从LocalDateTime中提取LocalDate或者LocalTime
      LocalDate date1 = dt1.toLocalDate();  
      LocalTime time1 = dt1.toLocalTime();
      
      // 获取当前日期和时间
      LocalDateTime now = LocalDateTime.now();
      
    4. DateTimeFormatter:以一定的格式创建代表特定日期或时间的字符串,和老的java.util.DateFormat相比较,所有的DateTimeFormatter实例都是线程安全 的。

      // 两个不同的格式器生成了字符串
      LocalDate date = LocalDate.of(2014, 3, 18);
      String s1 = date.format(DateTimeFormatter.BASIC_ISO_DATE); // 20140318 
      String s2 = date.format(DateTimeFormatter.ISO_LOCAL_DATE); // 2014-03-18
      
      // 通过解析代表日期或时间的字符串重新创建该日期对象
      LocalDate date1 = LocalDate.parse("20140318", DateTimeFormatter.BASIC_ISO_DATE); 
      LocalDate date2 = LocalDate.parse("2014-03-18", DateTimeFormatter.ISO_LOCAL_DATE);
      
      // 按照某个模式创建DateTimeFormatter
      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yy");
      LocalDate date1 = LocalDate.of(formatter);
      String formattedDate = date1.format(formatter);
      LocalDate date2 = LocalDate.parse(formattedDate, formatter);
      
      // 创建一个本地化的DateTimeFormatter 
      DateTimeFormatter italianFormatter = DateTimeFormatter.ofPattern("d. MMMM yyyy", Locale.ITALIAN); 
      LocalDate date1 = LocalDate.of(2014, 3, 18); 
      String formattedDate = date.format(italianFormatter); // 18. marzo 2014 
      LocalDate date2 = LocalDate.parse(formattedDate, italianFormatter);
      
      // DateTimeFormatterBuilder类构造更加复杂的格式器
      DateTimeFormatter italianFormatter = new DateTimeFormatterBuilder() 
              .appendText(ChronoField.DAY_OF_MONTH) 
              .appendLiteral(". ") 
              .appendText(ChronoField.MONTH_OF_YEAR) 
              .appendLiteral(" ") 
              .appendText(ChronoField.YEAR) 
              .parseCaseInsensitive() 
              .toFormatter(Locale.ITALIAN);
      

标签:实战,Optional,笔记,public,DateTimeFormatter,LocalDateTime,date,LocalDate,Java8
From: https://blog.csdn.net/line_0/article/details/143787989

相关文章

  • 论文学习笔记: Generalizable Vision-Tactile Robotic Grasping Strategy forDeformabl
    文章目录目录文章目录一、摘要Abstract二、介绍 Introduction三、相关工作RelatedWork四、方法Methology4.1SensingModalities传感方式4.2TransformerModel 4.3 FactorizationofSpatial-TemporalAttention时空注意力的分解4.4TimeSformer时序变换......
  • 论文学习笔记:Sim-to-Real Grasp Detection with Global-to-Local RGB-D Adaptation
    前言本文重点关注RGB-D抓取检测的模拟到真实问题,并将其表述为域适应问题。一、摘要Abstract目录一、摘要Abstract二、介绍Introduction三、相关工作RelatedWork3.1 Sim-to-RealTransfer模拟到真实的转变3.2Sim-to-realTransferforGraspDetection抓......
  • 《认知觉醒》读书笔记:焦虑与不同层次的成长权重
    最近在阅读《认知觉醒》这本书,读到了其中关于焦虑和耐心的那一章,感觉受到了一些启发,在这里分享给大家。书中对于焦虑的本质的描述非常精辟,这里摘录如下:归结起来,焦虑的原因就两条:想同时做很多事,又想立即看到效果。自己的欲望大于能力,又极度缺乏耐心。焦虑就是因为欲望与能......
  • 实战指南:理解 ThreadLocal 原理并用于Java 多线程上下文管理
    目录一、ThreadLocal基本知识回顾分析(一)ThreadLocal原理(二)既然ThreadLocalMap的key是弱引用,GC之后key是否为null?(三)ThreadLocal中的内存泄漏问题及JDK处理方法(四)部分核心源码回顾ThreadLocal.set()方法源码详解ThreadLocalMap.get()方法详解ThreadLocal.remove()方法源......
  • 软件测试笔记|Python自动化测试|python中的数值运算有何特点?
    一、类型方面特点1.类型丰富:支持整数(int)、浮点数(float)、复数(complex)等多种数值类型。2.动态类型:声明变量时无需指定类型,运行时确定类型。二、精度相关特点1.整数精度:整数类型不会溢出,可处理任意大小整数,受机器内存限制。2.浮点数精度:通常用双精度浮点数表示,符合IEEE7......
  • 软件测试笔记|Python自动化测试|isinstance与type有什么区别,分别有什么特点?
    一、区别isinstance和type都可用于判断对象的类型,但它们有明显区别:1.判断方式•type:直接返回对象的类型,是通过比较对象的类型是否完全相同来判断,更关注对象确切的类型本身。•isinstance:判断一个对象是否是指定类型(或其派生类型)的实例,考虑了继承关系,更灵活些。2.对继......
  • 工作学习笔记(九)负数判断
    今天的工作中,遇到一个问题,是充值金额没有负数校验。以下是几种在Java中添加充值金额为负数判断的常见情况示例,具体取决于应用场景是在网页开发、桌面应用等不同环境下。一、方法参数验证场景(以一个简单的充值方法为例)假设你有一个类,其中有个方法用于处理充值业务,方法接收充值......
  • 浅学AI笔记03:一个Transformer自注意力机制的故事
    ChatGPT、百度文心一言等同类的大模型,都使用了Transformer架构,Transformer最大的特点是其有一个“自注意力机制”,搬个定义说的是:允许模型在处理每个输入元素时,能够考虑其与序列中所有其他元素之间的相关性,从而动态调整其权重。白话来说,就是模型要先理解输入句子的含义,才能......
  • HTTP 协议学习笔记
    HTTP协议学习笔记带新手走进神秘的HTTP协议-超超boy-博客园HTTP首部字段详细介绍-超超boy-博客园《白帽子讲web安全(第二版)》HTTP默认的端口号为80,HTTPS的端口号为443。HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理。可以使用Cookie......
  • SpringBoot配置多数据源实战
    @目录SpringBoot配置多数据源实战需求来源:简单粗暴3步使用步骤:思路讲解:目录结构:使用注意点:SpringBoot配置多数据源实战需求来源:当相关业务场景想实现同时操作2个甚至多个不同数据库表的时候,就需要配置多个数据源。简单粗暴3步使用步骤:1.修改包名结构2.application.properti......