JAVA8新特性总结

本文详细介绍了Java8的新特性,包括Stream的使用、函数式编程的应用以及日期时间API的处理。通过实例展示了LocalDateTime的加减运算、日期格式化、Optional避免NPE问题,以及接口的默认方法和静态方法。同时,还讨论了在SpringBoot中如何处理LocalDateTime,以及Optional的orElse和orElseGet的区别。
摘要由CSDN通过智能技术生成

一、(转)Java8中Stream详细用法大全

二、JAVA8函数式编程应用

三、其他特性(日期、Optional、接口方法)

1、LocalDateTime用法

参考JDK8的LocalDateTime用法

import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class TimeTest {

    /**
     * 一、日期创建:
     * LocalDate localDate = LocalDate.now();
     * LocalTime localTime = LocalTime.now();
     * LocalDateTime localDateTime = LocalDateTime.now();
     *
     * LocalDate localDate = LocalDate.of(2016, 10, 26);
     * LocalTime localTime = LocalTime.of(02, 22, 56);
     * LocalDateTime localDateTime = 
     * LocalDateTime.of(2016, 10, 26, 12, 10, 55);
     *
     * 二、日期加减运算
     * plusDays, plusWeeks, plusMonths, plusYears
     * minusDays, minusWeeks, minusMonths, minusYears
     * plus, minus
     *
     * 三、日期比较计算
     * isBefore, isAfter
     *
     * 四、是否闰年
     * isLeapYear
     *
     * 五、时间戳与时间间隔运算
     * Instant 时间戳:以Unix元年(传统的设定为UTC时区1970年1月1日午夜时分)开始所经历的描述进行运算
     * Duration:用于计算两个“时间”间隔
     * Period:用于计算两个“日期”间隔
     *
     * 六、获取时间详细
     * 
     *
     * 七、日期解析和格式化
     * java.time.format.DateTimeFormatter类
     */
    public static void main(String[] args) {
         /**
         * 日期加减运算
         */
		LocalDateTime localDateTime = LocalDateTime.of(2019, Month.SEPTEMBER, 10, 14, 46, 56);
		//增加一年
		localDateTime = localDateTime.plusYears(1);  //结果: 2020-09-10 14:46:56
		localDateTime = localDateTime.plus(1, ChronoUnit.YEARS); //结果: 2021-09-10 14:46:56
		//减少一个月
		localDateTime = localDateTime.minusMonths(1);  //结果: 2021-08-10 14:46:56
		localDateTime = localDateTime.minus(1, ChronoUnit.MONTHS); //结果: 2021-07-10 14:46:56
		
		// 设置日期
		LocalDate localDate = LocalDate.of(2019, 9, 10);
		// 设置时间
		LocalTime localTime = LocalTime.of(13, 51, 10);

        /**
         * 获取时间详细
         */
		// 获取年
		int year = localDate.getYear();     //结果:2019
		int year1 = localDate.get(ChronoField.YEAR); //结果:2019
		// 获取月
		Month month = localDate.getMonth();   // 结果:SEPTEMBER
		int month1 = localDate.get(ChronoField.MONTH_OF_YEAR); //结果:9
		// 获取日
		int day = localDate.getDayOfMonth();   //结果:10
		int day1 = localDate.get(ChronoField.DAY_OF_MONTH); // 结果:10
		// 获取星期
		DayOfWeek dayOfWeek = localDate.getDayOfWeek();   //结果:TUESDAY
		int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK); //结果:2
       	//获取小时
		int hour = localTime.getHour();    // 结果:13
		int hour1 = localTime.get(ChronoField.HOUR_OF_DAY); // 结果:13
		//获取分
		int minute = localTime.getMinute();  // 结果:51
		int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR); // 结果:51
		//获取秒
		int second = localTime.getSecond();   // 结果:10
		int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE); // 结果:10
        /**
         * 计算时间间隔
         */
        Instant in1 = Instant.now();
        Instant in2 = Instant.now();
        System.out.println(Duration.between(in1, in2).toMillis());

        /**
         * 日期格式化
         */
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime time1 = LocalDateTime.now();
        String formatDateTime = time1.format(formatter);

        /**
         * 日期解析
         */
        LocalDateTime dateTime = LocalDateTime.parse(formatDateTime, formatter);
    }
}

2、Date与LocalDateTime转换

/**
  * LocalDateTime转毫秒时间戳
  * @param localDateTime LocalDateTime
  * @return 时间戳
  */
public static Long localDateTimeToTimestamp(LocalDateTime localDateTime) {
    try {
        ZoneId zoneId = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zoneId).toInstant();
        return instant.toEpochMilli();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 时间戳转LocalDateTime
 * @param timestamp 时间戳
 * @return LocalDateTime
 */
public static LocalDateTime timestampToLocalDateTime(long timestamp) {
    try {
        Instant instant = Instant.ofEpochMilli(timestamp);
        ZoneId zone = ZoneId.systemDefault();
        return LocalDateTime.ofInstant(instant, zone);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * Date转LocalDateTime
 * @param date Date
 * @return LocalDateTime
 */
public static LocalDateTime dateToLocalDateTime(Date date) {
    try {
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        return instant.atZone(zoneId).toLocalDateTime();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * LocalDateTime转Date
 * @param localDateTime LocalDateTime
 * @return Date
 */
public static Date localDateTimeToDate(LocalDateTime localDateTime) {
    try {
        ZoneId zoneId = ZoneId.systemDefault();
        ZonedDateTime zdt = localDateTime.atZone(zoneId);
        return Date.from(zdt.toInstant());
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

3、SpringBoot中应用LocalDateTime

将LocalDateTime字段以时间戳的方式返回给前端 添加日期转化类。并在LocalDateTime字段上添加@JsonSerialize(using = LocalDateTimeConverter.class)注解,如下:

public class LocalDateTimeConverter extends JsonSerializer<LocalDateTime> {
        @Override
        public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeNumber(value.toInstant(ZoneOffset.of("+8")).toEpochMilli());
        }
    }
@JsonSerialize(using = LocalDateTimeConverter.class)
protected LocalDateTime gmtModified;
3.1 后端返给前端日期格式
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;
3.2 前端传给后端日期格式化
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
protected LocalDateTime gmtModified;

4、Optional操作可有效避免NPE问题

orElse与orElseGet的区别在于orElseGet不创建空对象,节省内存

@Test
public void givenPresentValue_whenCompare_thenOk() {
    User user = new User("john@gmail.com", "1234");
    logger.info("Using orElse");
    User result = Optional.ofNullable(user).orElse(createNewUser());
    logger.info("Using orElseGet");
    User result2 = Optional.ofNullable(user).orElseGet(() -> createNewUser());
}
输出:
Using orElse
Creating New User
Using orElseGet

这个示例中,两个 Optional 对象都包含非空值,两个方法都会返回对应的非空值。不过,orElse() 方法仍然创建了 User 对象。与之相反,orElseGet() 方法不创建 User 对象。

在执行较密集的调用时,比如调用 Web 服务或数据查询,这个差异会对性能产生重大影响。

4.1 Optional使用场景:
4.1.1 转换值
String email = Optional.ofNullable(user)
      .map(u -> u.getEmail()).orElse("default@gmail.com");
4.1.2 流操作
Optional<User> result = Optional.ofNullable(user)
      .filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
    assertTrue(result.isPresent());
4.1.3 为null直接抛出异常
User result = Optional.ofNullable(user)
      .orElseThrow( () -> new IllegalArgumentException());

5、接口方法

5.1 接口种新增可定义静态方法与默认方法
 5 public class InterfaceTest {
 6     public static void main(String[] args) {
 7         MyImpl myClass = new MyImpl();
 8         System.out.println(myClass.getName());
 9         System.out.println(MyInterface.getAge());
10     }
11 }
12 
13 interface MyInterface {
14     default String getName(){
15         return "nana";
16     }
17 
18     static Integer getAge(){
19         return 18;
20     }
21 }
22 
23 /**
24  * 若一个接口中定义了一个默认方法,而另外一个父类中又定义了一个同名的方法时,取父类
25  * 若一个接口中定义了一个默认方法,而另外一个实现接口中又定义了一个同名的方法时,实现类需要执行重写其中一个
26  */
27 class MyImpl implements MyInterface {
28 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值