JDK8特性-新的日期和时间API
参考文献
Convert between Date to LocalDateTime
旧的日期和时间API的缺点
Date类的缺点
Date类中的大多数方法都已经过时,因为它们不是线程安全的,而且有一些设计缺陷.
Date类中的时间表示是基于1970年1月1日的毫秒数,这种表示方式不太方便处理日期和时间.
Calendar类的缺点
Calendar类不是线程安全的,如果多个线程同时访问一个Calendar实例,可能会导致不可预测的结果.
Calendar类中的月份是从0开始计数的,这种设计很容易导致错误.
Calendar类中的方法名不够直观,比如要设置月份要使用set(Calendar.MONTH, month),而不是setMonth(month).
DateFormat类的缺点
DateFormat类不是线程安全的,如果多个线程同时访问一个DateFormat实例,可能会导致不可预测的结果.
DateFormat类中的解析和格式化方法都很慢,因为它们需要进行字符串和日期之间的转换.
新的日期和时间API
java.time包的类
123456789101112 ...
JDK8特性-default方法
参考文献
Java8实战
解决问题的三条规则
如果一个类使用相同的函数签名从多个地方(比如另一个类或接口)继承了方法,通过三条规则可以进行判断.
类中的方法优先级最高.类或父类中声明的方法的优先级高于任何声明为默认方法的优先级.
如果无法依据第一条进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体.
1234567891011121314151617181920package com.holelin.sundry.test.common;public interface A { default void hello() { System.out.println("Hello from A"); }}interface B extends A { default void hello() { System.out.println("Hello from B&qu ...
JDK8特性-Stream流式操作
参考文献
Java8 实战
Stream API
只能对实现了java.util.Collection接口的类做流操作.
流(Stream)是数据渠道,用于操作数据源(集合,数组等)所生成的元素序列.
集合讲的是数据,流讲的是计算
Stream自己不会存储元素
Stream不会改变源对象.相反,它们会返回一个持有结果的新Stream.
Stream操作是延迟执行的,这意味着它们等到需要的时候才执行.
Stream支持同步执行,也支持异步执行.
惰性流
流是惰性的,在达到终止条件前不会处理元素,达到终止条件后逐个处理每个元素.如果遇到短路操作,那么只要满足所有条件,流处理就会终止.
对于集合而言,必须执行完所有操作才能进行下一步操作.对于流而言,各种中间操作构成一条流水线,但在流达到终止操作前不会处理任何元素,达到终止操作后只处理所需的值.
流处理并非任何情况下都有意义:如果进行任何状态操作(如排序或求和),就不得不处理所有值.但是如果无状态操作后跟一个短路终止操作,流处理的优点还是很明显的.
注意点
请注意,和迭代器类似,流只能遍历一次
12345678910publ ...
JDK8特性-lambda表达式
参考文献
Java攻略:Java常见问题的简单解法
Java8 实战
lambda表达式
函数式接口:是一种包含单一抽象方法(single abstract method)的接口.类通过为接口中的所有方法提供实现来实现任何接口,这可以通过顶级类(top-level class),内部类甚至匿名内部类完成.
lambda表达式必须匹配接口中单一方法签名的参数类型和返回类型,这被称为与方法签名兼容.因此lambda表达式属于接口方法的实现,可以将其赋值给该接口类型的引用.
Java库中不存在名为lambda的类,lambda表达式只能被赋值给函数式接口引用.
lambda表达式在任何情况下都不能脱离上下文存在,上下文指定了将表达式给哪个函数式接口.
lambda表达式既可以是方法的参数,也可以是方法的返回类型,还可以被赋给引用.
无论哪种情况,赋值类型必须为函数式接口.
lambda表达式的本质就是匿名函数,在定义和调用时不需要被赋予类型名或绑定到标识符.
方法引用
使用**双冒号表示法(::)**将示例引用或类名与方法分开.
语法
object: ...