自己整理的java8新特性及demo
1. Lambda表达式 1
2. 方法的引用 6
3. 构造器引用 7
4. 函数式(Functional)接口 7
5. 四大函数式接口 8
6. Stream 11
7. Map接口的新方法: 19
8. 并行流与串行流 20
9. Optional容器类 23
10. 接口中默认的方法和静态方法 26
11. 日期 26
Java 8 是一个重要的版本更新,引入了许多新特性,极大地提升了开发效率和代码的可读性。以下将详细讲解其中的一些关键特性。
1. **Lambda 表达式**:
- Lambda 表达式允许我们将代码块当作参数传递,简化了匿名内部类的使用,特别是在处理函数式接口时。它采用 `(参数列表) -> {代码块}` 的形式。
- Lambda 表达式的好处包括代码简洁、减少冗余,并且不会为每个匿名内部类生成额外的 `.class` 文件。
- 示例:`IEat i = (thing, name) -> {System.out.println("eat... " + thing); System.out.println(name);};`
- Lambda 表达式中的参数可以是 `final` 或等效的 `effectively final`,意味着它们不能在代码块内被重新赋值。
- Lambda 表达式也可以有返回值,例如 `i.eat("小小", "大大")` 将执行并返回一个值。
- Lambda 表达式促进了函数式编程风格在 Java 中的应用,如在集合操作中使用。
2. **函数式接口**:
- 函数式接口是仅包含一个抽象方法的接口,如 `Runnable`, `Callable` 和自定义的 `MyPredicate`。
- Java 8 引入了 `@FunctionalInterface` 注解来标记此类接口,但不是必需的,因为编译器会自动检查是否只有一个抽象方法。
- `MyPredicate` 示例展示了如何自定义一个函数式接口,并通过 Lambda 表达式实现。
3. **Stream API**:
- Stream API 提供了一种声明性处理数据的方式,尤其适合对集合进行操作,如过滤、映射和收集。
- `filterEmployeesBySalary` 方法演示了如何使用传统循环实现过滤操作。使用 Stream API 后,可以简化为一行代码:
```java
List<Employee> data = emps.stream()
.filter(e -> e.getSalary() > 5000)
.collect(Collectors.toList());
```
- Stream API 支持串行和并行流,`parallelStream()` 可以创建并行流,从而利用多核处理器提高性能。
4. **方法与构造器引用**:
- 除了 Lambda 表达式,Java 8 还允许直接引用方法或构造器作为函数式接口的实现。例如:
```java
Comparator<String> com = String::compareTo;
Supplier<String> supplier = String::new;
```
5. **Optional 类**:
- `Optional` 是一个容器类,用于表示可能不存在的值,避免了 `null` 检查带来的空指针异常风险。
- 示例:`Optional<String> optional = Optional.ofNullable(someValue);`
- `Optional` 提供了 `isPresent()`, `get()`, `orElse()` 等方法来安全地访问或处理值。
6. **接口的默认方法和静态方法**:
- 默认方法允许在接口中定义带有实现的方法,使得接口可以随着新功能的增加而演进,而不破坏实现该接口的类。
- 静态方法允许在接口中添加工具方法,无需实例化接口就能调用。
7. **Map 接口的新方法**:
- Java 8 为 `Map` 接口增加了新方法,如 `forEach`, `putIfAbsent`, `getOrDefault` 等,使 Map 的操作更加便捷。
8. **日期与时间 API**:
- Java 8 引入了全新的 `java.time` 包,替换了过时的 `java.util.Date` 和 `Calendar` 类,提供了更强大、更直观的日期和时间处理。
以上只是 Java 8 新特性的一部分,还有许多其他改进,如新的日期时间 API、Nashorn JavaScript 引擎、并发改进等。理解并掌握这些特性对于提升 Java 开发能力至关重要。