Java8学习

Java系列记录文章。

学习笔记

lambda

允许通过::关键字获取方法(可以是类的静态方法,也可以是对象的方法)或者构造函数的的引用.

范围: 与匿名函数类似,可以访问对应外部区域的final变量,成员变量和静态变量. 默认方法无法在lambda表达式内部被访问.

内置函数式接口:

  • Comparator
  • Runnable
  • Predicate 布尔型函数判断
  • Function 接受一个参数,处理并返回
  • Supplier 与Function的区别是没有输入参数
  • Consumer

工具接口Optional

用来防止NullPointerException

  • isPresent()

Streams/流

某种元素的序列,可在其上进行各种中间操作或完结操作

构造流:

  • Collections.stream()
  • Collection.parallelStream()

常用类:

  • IntStream.rangeClosed(1,10),forEach()

常用函数式接口

  • Filter接受一个predicate接口类型的变量,并将所有流对象中的元素进行过滤 (中间操作)
  • Sorted能够返回一个排过序的流对象的视图,但不会改变原来集合中元素的顺序(中间操作)
  • map是一个对于流对象的中间操作
  • ForEach接受一个function接口类型的变量,用来执行对每一个元素的操作。ForEach是一个中止操作,不返回流。
  • Match匹配操作是终结操作,只返回一个boolean类型的结果
  • Count是一个终结操作
  • Reduce该操作是一个终结操作,操作的结果会放在一个Optional变量里返回

日期和时间

这些时间对象都是不可变的,因此是线程安全的。

  • Clock 当前时区相关
  • LocalDateTime 与时区无关的本地时间
  • Duration 时间区间
  • DateTimeFormatter 新实现

常用方法:

Clock clock = Clock.systemDefaultZone();
// 替代 System.currentTimeMillis()
long millis = clock.millis();

Instant instant = clock.instant();
Date legacyDate = Date.from(instant);   // legacy java.util.Date

// 时区
ZoneId zone = ZoneId.of("Asia/Chongqing");
LocalTime now = LocalTime.now(zone);

Instant instant = dateTime
        .atZone(ZoneId.systemDefault())
        .toInstant();
LocalDateTime dateTime = LocalDateTime.now();
LocalDate.of(2019, Month.OCTOBER,16);
dateTime.toLocalDate();
dateTime.getMonth();
// 更新时间
dateTime.withDayOfMonth(13).withYear(2018);
dateTime.plusDays(25).plusYears(2);
dateTime.with(TemporalAdjusters.lastDayOfMonth());


LocalTime t2 = LocalTime.parse("10:15:30");
t2.truncatedTo(ChronoUnit.MINUTES);

时间和字符串转化

LocalTime time = LocalTime.parse("17:07:30");

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy");
LocalDate date = LocalDate.of(2019, Month.OCTOBER, 16);
System.out.println(date.format(formatter));

学习资源