一、lambda表达式
1、用lambda表达式实现Runnable
1 | (params) -> expression |
1 | // Java 8之前: |
1 | //Java 8方式: |
2、使用Java 8 lambda表达式进行事件处理
1 | // Java 8之前: |
1 | // Java 8方式: |
3、使用lambda表达式对列表进行迭代
针对集合进行循环遍历操作
1 | // Java 8之前: |
1 | // Java 8之后: |
4、使用lambda表达式和函数式接口Predicate
适合用于过滤
1 | public static void main(args[]){ |
1 | // 更好的办法 |
5、如何在lambda表达式中加入Predicate
1 | // 甚至可以用and()、or()和xor()逻辑函数来合并Predicate, |
6、Java 8中使用lambda表达式的Map和Reduce示例
1 | // 不使用lambda表达式为每个订单加上12%的税 |
1 | // 为每个订单加上12%的税 |
7、通过过滤创建一个String列表
1 | // 创建一个字符串列表,每个字符串长度大于2 |
8、对列表的每个元素应用函数
1 | // 将字符串换成大写并用逗号链接起来 |
9、复制不同的值,创建一个子列表
distinct() 方法来对集合进行去重
1 | // 用所有不同的数字创建一个正方形列表 |
10、计算集合元素的最大值、最小值、总和以及平均值
1 | //获取数字的个数、最小值、最大值、总和以及平均值 |
二、接口的默认方法与静态方法
JDK8及以后,允许我们在接口中定义static方法和default方法
1 | public interface JDK8Interface { |
再定义一个接口的实现类:
1 | public class JDK8InterfaceImpl implements JDK8Interface { |
静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。default方法,只能通过接口实现类的对象来调用。
1 | public class Main { |
当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。
1 | public class AnotherJDK8InterfaceImpl implements JDK8Interface { |
由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?如果有两个接口中的静态方法一模一样,并且一个实现类同时实现了这两个接口,此时并不会产生错误,因为jdk8只能通过接口类调用接口中的静态方法,所以对编译器来说是可以区分的。但是如果两个接口中定义了一模一样的默认方法,并且一个实现类同时实现了这两个接口,那么必须在实现类中重写默认方法,否则编译失败。
三、方法引用
方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
类型 | 示例 |
---|---|
引用静态方法 | ContainingClass::staticMethodName |
引用某个对象的实例方法 | containingObject::instanceMethodName |
引用某个类型的任意对象的实例方法 | ContainingType::methodName |
引用构造方法 | ClassName::new |
1、静态方法引用
例子:
1 | String::valueOf 等价于lambda表达式 (s) -> String.valueOf(s) |
2、特定实例对象的方法引用
3、任意对象(属于同一个类)的实例方法引用
例子:
1 | String[] stringArray = { "Barbara", "James", "Mary", "John", "Patricia", "Robert", "Michael", "Linda" }; |
4、构造方法引用
例子:
1 | String::new, 等价于lambda表达式 () -> new String() |
四、重复注解
Java 8引入重复注解,这样相同的注解在同一地方也可以声明多次。
五、扩展注解的支持
Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。
六、Optional
七、Stream
八、Date/Time API (JSR 310)
- Instant——它代表的是时间戳
- LocalDate——不包含具体时间的日期,比如2014-01-14。它可以用来存储生日,周年纪念日,入职日期等。
- LocalTime——它代表的是不含日期的时间
- LocalDateTime——它包含了日期及时间,不过还是没有偏移信息或者说时区。
- ZonedDateTime——这是一个包含时区的完整的日期时间,偏移量是以UTC/格林威治时间为基准的。
九、JavaScript引擎Nashorn
十、Base64
参考
Java9都快发布了,Java8的十大新特性你了解多少呢?
Java8 lambda表达式10个示例
JDK8新特性:接口的静态方法和默认方法
Java8之方法引用