Day04 日期时间-Lambda表达式

Day04 日期时间-Lambda表达式

日期与时间

data类概述

Date 类的对象在归va 中代表的是当前所在系统的此刻日期时间。

Date的构造器

名称 说明
public Date() 创建一个Date 对象, 代表的是系统当前此刻日期时间。

Date的常用方法

名称 说明
public long getTime() 获取时间对象的毫秒值

Date类记录时间的2种形式

形式1:日期对象

//1.创建一个Date类的对象,代表系统此刻时间日期对象
Date d = new Date();
System.out.println(d);

形式2:时间毫秒值

指从1970年1月1日,00:00:00走到此刻的总的毫秒数,应该是很大的
    long time = d.getTime();
	System.out.println(time);

案例:

请计算出当前时间往后走1小时121秒之后的时间是多少

时间毫秒值->日期对象

构造器 说明
public Date(long time) 把时间毫秒值转换成Date日期对象
Date方法 说明
public void setTime(long time) 设置日期对象的时间为当前时间毫秒值对应的时间
public class DateDemo01 {
    public static void main(String[] args) {
        //1.创建一个Date类的对象,代表系统此刻时间日期对象
        Date d = new Date();
        System.out.println(d);

        //2.获取当前时间毫秒值
        long time = d.getTime();
        System.out.println(time);
        System.out.println("---------------");
        long time1 = System.currentTimeMillis();
        System.out.println(time1);

        System.out.println("-----------");
        //1.当前时间的毫秒值
        Date d1 = new Date();
        System.out.println(d1);

        //2.当前时间往后走1小时121s
        long time2 = System.currentTimeMillis();
        time2 += (60 * 60 + 121) * 1000;

        //3.把时间毫秒值转换成对应的日期对象
        Date d2 = new Date(time2);
        System.out.println(d2);

        //4.另外一种方法
        Date d3 = new Date();
        d3.setTime(time2);
        System.out.println(d3);
    }
}

![image-20220425123841397](Day04 日期时间-Lambda表达式.assets/image-20220425123841397.png)

SimpleDateFormat类的作用

可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式

也可以把字符串的时间形式解析成日期对象

![image-20220425124418189](Day04 日期时间-Lambda表达式.assets/image-20220425124418189.png)

SimpleDateFormat的构造器

构造器 说明
SimpleDateFormat() 构造一个SimpleDateFormat,使用默认格式
SimpleDateFormat(String pattern) 构造一个SimpleDateFormat,使用指定的格式

SimpleDateFormat的格式化方法

格式化方法 说明
public final String format(Date date) 将日期格式化成日期/时间字符串
public final String format(Object time) 将时间毫秒值化成日期/时间字符串

格式化时间形式的常用模式对应关系如下

![image-20220425141959609](Day04 日期时间-Lambda表达式.assets/image-20220425141959609.png)

public class SimpleDateFormatDemo01 {
    public static void main(String[] args) {
        //1.日期对象
        Date d = new Date();
        System.out.println(d);

        //2.格式化这个日期对象(指定最终格式化的形式)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd EEE HH:mm:ss a");

        //3.开始格式化日期对象成为喜欢的字符串形式
        String rs = sdf.format(d);
        System.out.println(rs);
    }
}

SimpleDateFormat解析字符串时间成为日期时间

解析方法 说明
public Date parse(String source) 从给定字符串的开始解析文本以生成时间

案例:

请计算出2021年08月06日11点11分11秒,往后走2天14小时49分06秒后的时间是多少?

public class SimpleDateFormatDemo02 {
    public static void main(String[] args) throws ParseException {
        System.out.println("----解析字符串时间----");
        //请计算出2021年08月06日11点11分11秒,往后走2天14小时49分06秒后的时间是多少?

        //1.把字符串时间拿到程序中去
        String time = "2021年08月06日 11:11:11";

        //2.把字符串时间解析成时间对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date d = sdf.parse(time);

        //3.往后走2天14小时49分06秒后的时间
        long time1 = d.getTime() + (2 * 24 * 60 * 60 + 14 * 60 * 60 + 49 * 60 + 6) * 1000;
        
        //4.格式化这个时间毫秒值就是结果
        System.out.println(time);
        String rs = sdf.format(time1);
        System.out.println(rs);
    }
}
总结
//1 、SimleDateFormat 可以格式化哪些时间形式?
SimpIeDateFormat sdf = new Simp1eDateFormat("yyyy-MM-dd HH:mm:ss);
String rsl = sdf.format(date);
String rs2 = sdf.format(time);

//2 、SimpleDateFormat 如何进行字符串时间的解析的?
Simp1eDateFormat sdf = new SimpIeDateFormat"yyyy-MM-dd HH:mm:ss);
Date d = sdf.parse(("2021-08-04 11:11:11) ;

Calendar概述(日历)

  • Calendar代表了系统此刻日期对应的日历对象

  • Calendar是一个抽象类,不能直接创建对象

Calendar日历类创建日历对象的方法:(掉方法)

public static Calendar getInstance()  ->获取当前日历对象
    Calendar cal = Calendar.getInstance();

Calendar常用方法:

方法名 说明
public int get(int field) 取日期中的某个字段信息。
public void set(int field,int value) 修改日历的某个字段信息。
public void add(int field, int amount) 为某个字段增加/减少指定的值
public final Date getTime() 拿到此刻日期对象。
public long getTimeInMillis() 拿到此刻时间毫秒值

calendar是可变日期对象,一旦修改后其对象本身表示的时间将产生变化。

JDK8新增日期类

概述:LocalTime、LocalDate、LocalDateTime

![image-20220425185124469](Day04 日期时间-Lambda表达式.assets/image-20220425185124469.png)

![image-20220425185142273](Day04 日期时间-Lambda表达式.assets/image-20220425185142273.png)

![image-20220425192838046](Day04 日期时间-Lambda表达式.assets/image-20220425192838046.png)
![image-20220425193130631](Day04 日期时间-Lambda表达式.assets/image-20220425193130631.png)

Instant时间戳

![image-20220425195104903](Day04 日期时间-Lambda表达式.assets/image-20220425195104903.png)

DateTimeFormatter:

![image-20220425195953748](Day04 日期时间-Lambda表达式.assets/image-20220425195953748.png)

Duration/Period

Period:

![image-20220425201138267](Day04 日期时间-Lambda表达式.assets/image-20220425201138267.png)

Duration:

![image-20220425201503136](Day04 日期时间-Lambda表达式.assets/image-20220425201503136.png)

ChronoUnit:用于在单个时间单位内测量一段时间

//本地日期时间对象
LocalDateTime today = LocalDateTime.now();
System.out.println(today);

//出生的日期对象
LocalDateTime birTime = LocalDateTime.of(1999, 11, 13, 05, 22,50);
System.out.println(birTime);

System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birTime,today));
System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birTime,today));
System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birTime,today));
System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birTime,today));
System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birTime,today));
System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birTime,today));
System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birTime,today));
System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birTime,today));
System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birTime,today));
System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birTime,today));
System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birTime,today));
System.out.println("相差的半天十年数:" + ChronoUnit.DECADES.between(birTime,today));
System.out.println("相差的半天世纪(百年)数:" + ChronoUnit.CENTURIES.between(birTime,today));

包装类:

其实就是8中基本数据类型对应的引用数据类型

基本数据类型 引用数据类型
byte Byte
short Short
int Integer
long Long
char Character
float Float
double Double
boolean Boolean

为什么提供包装类:

  • java为了实现一切皆对象,为8种基本类型提供了对应的引用类型

  • 后面的集合和泛型其实也只能支持包装类型

自动装箱: 基本类型的数据和变量可以直接赋值给包装类型的变量。

int a = 10;
Integer a2 = a;//自动装箱

自动拆箱: 包装类型的变量可以直接赋值给基本数据类型的变量。

Integer it = 100;
int it1 = it;//自动拆箱

包装类的特有功能

  • 包装类的变量的默认值可以是null ,容错率更高

int age = null;//会报错
Integer age1 = null;//是可以的
  • 可以把基本类型的数据转换成字符串类型( 用处不大)

  • 调用tostring() 方法得到字符串结果。
  • 调用lnteger.toString( 基本类型的数据)。

可以把字符串类型的数值转换成真实的数据类型( 真的很有用)

  • lnteger.parselnt( " 字符串类型的整数" )
  • Double.parseDouble( " 字符串类型的小数” ) 。
  • 用Double/Integer.valueof(String s)可以实现一样的效果

![image-20220426130043046](Day04 日期时间-Lambda表达式.assets/image-20220426130043046.png)

正则表达式:

正则表示:

正则表达式可以用一些规定的字符来制定规则,并用来校验数据格式的合法性

![image-20220426143327543](Day04 日期时间-Lambda表达式.assets/image-20220426143327543.png)

String类的哪个方法可以与正则表达式进行匹配

public boolean matches(String regex);
//判断是否匹配正则表达式,匹配返回true,不匹配返回false

正则表达式在字符串方法中的应用

方法名 说明
public String replaceAll(String regex,String newStr) 按正则表达式匹配的内容进行替换
public String[] split(String regex) 按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组

正则表达式爬取信息

public class RegexDemo05 {
    public static void main(String[] args) {
        String rs = "来地大学习地质工程,电话100-120119,或者联系邮箱" +
                "1202120421@cug.com,电话15072179532,027-5715330" +
                "邮箱21312321213@qq.com,电话15827290767";

        //需求,从上面的内容中爬取去 电话号码和邮箱
        //1.定义爬取规则
        String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]" +
                "{2,20}){1,2}|(1[3-9]\\d{9})" + "|(0\\d{2,6}-?\\d{5,20})" +
                "|(400-?\\d{3,9}-?\\d{3,9}))";

        //2.把这个爬取数据编译成匹配对象
        Pattern pattern = Pattern.compile(regex);

        //3.得到一个内容匹配器对象
        Matcher matcher = pattern.matcher(rs);

        //4.开始找了
        while (matcher.find()){
            String rs1 = matcher.group();
            System.out.println(rs1);
        }
    }
}
1202120421@cug.com
15072179532
027-5715330
21312321213@qq.com
15827290767

Arrays类

Arrays类概述

数组操作工具类,专门用于操作数组元素的

Arrays类的常用API

方法名 说明
public static String toString(类型[] a) 对数组进行排序
public static void sort(类型[] a) 对数组进行默认升序排序
public static void sort(类型[] a,Comparator <? super T>c) 使用比较器对象自定义排序
public static int bbinarySearch(int[] a,int key) 二分搜索数组中的数据,存在返回索引,不存在返回-1

自定义排序规则

设置Comparator接口对应的比较器对象,来定制比较规则

![image-20220426160804837](Day04 日期时间-Lambda表达式.assets/image-20220426160804837.png)

常见算法

选择排序的思想

每轮选择当前位置,开始找出后面的较小值与该位置交换

选择排序的关键

确定总共需要选择几轮:数组的长度-1;

控制每轮从以前位置为基准,与后面元素选择几次

image-20220426215546445

二分查找

二分查找性能好,二分查找的前提是必须排好序的数据

二分查找相当于每次去掉一半的数据

二分查找--元素不存在:

  • 结论:二分查找正常的检索条件应该是开始位置min<=结束位置max

实现步骤:

image-20220426222840657

Lambda表达式

Lambad概述:

. Lambda 表达式EJDK 8 开始后的一种新语法形式。

. 作用: 简化匿名内部类的代码写法。

Lambda 表达式的简化格式

(匿名内部类被重写方法的形参列表)-> {
被重写方法的方法体代码。
}
注: -> 是语法形式/ 无实际含义

Lambda表达式只能简化函数式接口的匿名内部类的写法形式。

什么是函数式接口

  • 首先必须是接口,其次接口中有且仅有一个抽象方法的形式

  • 通常我们会在接口上加上一个@FunctionalInterface注解,标记该接口必须是满足函数时接口

总结~
//1 、Lambda 表达式的基本作用?
. 简化函数式接囗的匿名内部类的写法。
//2 、Lambda 表达式有什么使用前提?
. 必须是接囗的匿名内部类, 接囗中只能有一个抽象方法
//3 、Lambda 的好处?
. Lambda是一个匿名函数,我们可以把Lambda表达式理解为
是一段可以传递的代码,它可以写出更简洁、更灵活的代码,
作为一种更紧凑的代码风格,java语言表达能力得到了提升。

Lambda 表达式的省略写法(进一步在Lambda 表达式的基础上继续简化)

. 数类型可以省略不写。

. 如果只有一个参数, 参数类型可以省略, 同时0 也可以省略。

. 如果Lambda 表达式的方法体代码只有一行代码。可以省略大括号不写, 同时要省略分号!

. 如果Lambda 表达式的方法体代码只有一行代码。可以省略大括号不写。此时, 如果这行代码是return语句, 必须省略return 不写, 同时也必须省略; 不写

public class LambdaDemo02 {
    //Lambda表达式只能简化函数式接口的匿名内部类的写法形式。
    public static void main(String[] args) {
        /*Swimming s1 = new Swimming(){
            @Override
            public void Swim() {
                System.out.println("老师游得快!");
            }
        };
        go(s1);*/
        Swimming s1 = () ->{
            System.out.println("老师游得慢~");
        };
        Swimming s2 = () -> System.out.println("老师游得慢~");
        go(s1);

        System.out.println("-----------");
       /* go(new Swimming() {
            @Override
            public void Swim() {
                System.out.println("学生很会🏊‍");
            }
        });*/
        go(() ->{
            System.out.println("学生很会🏊‍");
        });
        go(() -> System.out.println("学生很会🏊‍"));
    }

    public static void go(Swimming s){
        System.out.println("开始~");
        s.Swim();
        System.out.println("结束~");
    }
}

@FunctionalInterface//标记该接口必须是满足函数时接口,接口中有且仅有一个抽象方法的形式
interface Swimming{
    void Swim();
posted on 2022-04-26 23:07  Cafune-Ding  阅读(908)  评论(0)    收藏  举报