首页 > 编程语言 >Java8新特性

Java8新特性

时间:2023-07-06 14:22:39浏览次数:40  
标签:format System 特性 public println LocalDate Java8 out

Java8新特性

接口

首先是接口中能够定义default和statis方法体了,这样子就不用接口一改,下面的实现类都改了

默认方法提供了默认的行为,而静态方法提供了在接口级别上的通用功能。

和抽象类的区别还是有的

  • 接口的方法是 public 修饰,变量是 public static final 修饰,默认是 public static final 修饰的,且不能修改。

  • abstract class 可以用其他修饰符

接口中的方法默认是 public 修饰的,不能修改为其他访问修饰符(如 privateprotected

 

lambda表达式

在lambda表达式中 说一下之前不熟悉的::的用法

这个::是用来引用方法的,可以把方法直接拿出来,也可以引用构造函数

如下用法

  1. 静态方法引用:ClassName::staticMethodName 这种形式表示引用一个类的静态方法。例如,Math::max 表示引用 Math 类的静态方法 max

  2. 实例方法引用:instance::instanceMethodName 这种形式表示引用一个对象的实例方法。例如,String::toUpperCase 表示引用 String 对象的 toUpperCase 方法。

  3. 构造方法引用:ClassName::new 这种形式表示引用一个类的构造方法。例如,ArrayList::new 表示引用 ArrayList 类的构造方法。

 

对于实例方法引用如下

class Counter {
   private int count = 0;
   public void increment() {
       count++;
  }
   public int getCount() {
       return count;
  }
}

Counter counter = new Counter();
//直接拿方法过来
Runnable runnable = counter::increment;
runnable.run();
System.out.println(counter.getCount());

 

遍历的时候拿方法

class Person {
   private String name;
   public Person(String name) {
       this.name = name;
  }
   public void printName() {
       System.out.println(name);
  }
}

//用类去拿是Consumer
Consumer<Person> getX = Person::getX;

//用对象去拿是 Runnable
Runnable getX = person::getX;


List<Person> people = Arrays.asList(new Person("Alice"), new Person("Bob"), new Person("Charlie"));
people.forEach(Person::printName);

用类去拿是Consumer Consumer<Person> getX = Person::getX;

用对象去拿是 Runnable Runnable getX = person::getX;

 

Stream流

流用过一次后就不能用了,操作就会关闭

 

Optional

判断是否为空

Optional.ofNullable
   
   true 不为空
   public boolean isPresent() {
       return value != null;
  }

其他类型如下

//of():为非null的值创建一个Optional
Optional<String> optional = Optional.of("bam");
// isPresent():如果值存在返回true,否则返回false
optional.isPresent();           // true
//get():如果Optional有值则将其返回,否则抛出NoSuchElementException
optional.get();                 // "bam"
//orElse():如果有值则将其返回,否则返回指定的其它值
optional.orElse("fallback");    // "bam"
//ifPresent():如果Optional实例有值则为其调用consumer,否则不做处理
optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"

 

 

 

Date Time类

java.util.Date 既包含日期又包含时间,而 java.time 把它们进行了分离

LocalDateTime.class //日期+时间 format: yyyy-MM-ddTHH:mm:ss.SSS
LocalDate.class //日期 format: yyyy-MM-dd
LocalTime.class //时间 format: HH:mm:ss

 

所以用LocalDateTime类更加简洁点

如下是日期转字符串

public void newFormat(){
   //format yyyy-MM-dd
   LocalDate date = LocalDate.now();
   System.out.println(String.format("date format : %s", date));

   //format HH:mm:ss
   LocalTime time = LocalTime.now().withNano(0);
   System.out.println(String.format("time format : %s", time));

   //format yyyy-MM-dd HH:mm:ss
   LocalDateTime dateTime = LocalDateTime.now();
   DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
   System.out.println(String.format("dateTime format : %s", dateTimeStr));
}

如下是字符串转日期

LocalDate date = LocalDate.of(2021, 1, 26);
LocalDate.parse("2021-01-26");

LocalDateTime dateTime = LocalDateTime.of(2021, 1, 26, 12, 12, 22);
LocalDateTime.parse("2021-01-26 12:12:22");

LocalTime time = LocalTime.of(12, 12, 22);
LocalTime.parse("12:12:22");

选of 或者pase都行,parse就直接转化了

 

判断过x天的日期

public void pushWeek(){
    //一周后的日期
    LocalDate localDate = LocalDate.now();


    LocalDate after2 = localDate.plusWeeks(1);
    System.out.println("一周后日期:" + after2);

    //算两个日期间隔多少天,计算间隔多少年,多少月
    LocalDate date1 = LocalDate.parse("2021-02-26");
    LocalDate date2 = LocalDate.parse("2021-12-23");
    Period period = Period.between(date1, date2);
    System.out.println("date1 到 date2 相隔:"
               + period.getYears() + "年"
               + period.getMonths() + "月"
               + period.getDays() + "天");
  //打印结果是 “date1 到 date2 相隔:0年9月27天”
    //这里period.getDays()得到的天是抛去年月以外的天数,并不是总天数
    //如果要获取纯粹的总天数应该用下面的方法
    long day = date2.toEpochDay() - date1.toEpochDay();
    System.out.println(date2 + "和" + date2 + "相差" + day + "天");
    //打印结果:2021-12-23和2021-12-23相差300天
}

获取当月的第一天和最后一天

public void getDayNew() {
   LocalDate today = LocalDate.now();
   //获取当前月第一天:
   LocalDate firstDayOfThisMonth = today.with(TemporalAdjusters.firstDayOfMonth());
   // 取本月最后一天
   LocalDate lastDayOfThisMonth = today.with(TemporalAdjusters.lastDayOfMonth());
   //取下一天:
   LocalDate nextDay = lastDayOfThisMonth.plusDays(1);
   //当年最后一天
   LocalDate lastday = today.with(TemporalAdjusters.lastDayOfYear());
   //2021年最后一个周日,如果用Calendar是不得烦死。
   LocalDate lastMondayOf2021 = LocalDate.parse("2021-12-         31").with(TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY));
}

 

JDBC和java8的类型对应

现在 jdbc 时间类型和 java8 时间类型对应关系是

  1. Date ---> LocalDate

  2. Time ---> LocalTime

  3. TimesSamp ---> LocalDateTime

 

时区转化

//当前时区时间
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println("当前时区时间: " + zonedDateTime);

//东京时间
ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("JST"));
ZonedDateTime tokyoTime = zonedDateTime.withZoneSameInstant(zoneId);
System.out.println("东京时间: " + tokyoTime);

// ZonedDateTime 转 LocalDateTime
LocalDateTime localDateTime = tokyoTime.toLocalDateTime();

 

java8的merge()操作

原理就是将一个key 更新值(如果存在的话),并且将这两个value作函数操作。如果给定的key不存在,它就变成了 put(key, value)

如下图

HashMap<String, Integer> map = new HashMap<>();

map.put("1",1);
map.put("2",1);
map.put("3",1);
map.put("4",1);

map.merge("2",10,Integer::sum);
System.out.println(map.get("2"));


输出
11

标签:format,System,特性,public,println,LocalDate,Java8,out
From: https://www.cnblogs.com/gulilearn/p/17532022.html

相关文章

  • 浅谈java8中map的新方法
    Map在java8中新增了两个replace的方法1.replace(k,v)在指定的键已经存在并且有与之相关的映射值时才会将指定的键映射到指定的值(新值)在指定的键不存在时,方法会return回来一个nulljavadoc的注释解释了该默认值方法的实现的等价Java代码:if(map.containsKey(key)){returnmap.put(ke......
  • Java17新特性及代码示例:还在使用Java8? 这5个Java17新功能,你会喜欢的
    SpringBoot3.0最低支持JDK17,各开源软件正在全面拥抱JDK17.有升级计划的调查受访者中,37%的人计划在未来六个月内升级到2021年9月份发布的LTS版本JDK17。另有25%的人计划在未来6到12个月内升级到JDK17。这5个你喜欢的JDK17新功能,会让你升级JDK17吗?1.record类(记录类)传统的......
  • Redis 6.0 新特性-多线程连环13问!
    导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安全问题?多线程的实现原理是怎样的?带着这些疑问,我们来开启Redis新特性-多线程连环13问。 imageRedis......
  • Java9-17新特性解读+案例+说明+注意+发展趋势
    前言Java8出来这么多年后,已经成为企业最成熟稳定的版本,相信绝大部分公司用的还是这个版本,但是一眨眼今年Java19都出来了,相信很多Java工程师忙于学习工作对新特性没什么了解,有的话也仅限于某一块。本篇就是博主对自己感觉有用的新特性做了一个案例验证及简要说明,整合起来分享给......
  • 【大厂面试必问】Java8 新特性
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家✌......
  • java8 日期、时间处理类
    一、LocalDate类创建LocalDate方法说明staticLocalDatenow()获取默认时区的当前日期,默认返回格式yyyy-MM-ddstaticLocalDatenow(Clockclock)从指定时钟获取当前日期staticLocalDatenow(ZoneIdzone)获取指定时区的当前日期staticLocalDateof(i......
  • CSS(六)CSS3新特性
    圆角和阴影圆角,使用border-radius可以给任何元素制作圆角阴影,box-shadow向框添加一个或多个阴影:box-shadow:h-shadowv-shadowblurcolorh-shadow水平阴影的位置v-shadow垂直阴影的位置blur模糊距离color阴影的颜色动画使用百分比来规定变化发生......
  • java8发送邮件失败, 修改jdk镜像中的java.security文件
    背景原本部署环境中的java:8镜像在检查问题删除,用dockerpullopenjdk:8重新拉取并改名java:8,在重新部署后,发送邮件报错:javax.net.ssl.SSLHandshakeException:Noappropriateprotocol(protocolisdisabledorciphersuitesareinappropriate)!!!原因根本原因是j......
  • .NET 7 新特性全面解析
    在2021年11月8日发布的.NET6当前已经广泛使用。微软团队已经开始着手为.NET7制定计划和新特性。本文将为您全面解析.NET7的新特性,并提供源代码示例。1.更好的性能.NET7将继续提高运行时性能,改进JIT编译器,减少内存分配,优化GC,以及提高ASP.NETCore和EntityF......
  • CallerMemberName特性的使用
    C#6.0引入的一个特性,在属性或方法的参数中使用,用来获取调用者的成员名。1.在方法中使用publicclassMyClass{privatestring_myProperty;publicstringMyProperty{get{return_myProperty;}set{_myPropert......