Java 8 是 Java 语言发展的一个重要里程碑,引入了许多革命性的特性。以下是 Java 8 的主要新特性:
一、Lambda 表达式
函数式编程的核心特性
java
// 旧方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello");
}
}).start();
// Lambda 表达式
new Thread(() -> System.out.println("Hello")).start();
// 更复杂的例子
list.sort((a, b) -> a.compareTo(b));
二、函数式接口
只有一个抽象方法的接口,可以使用 @FunctionalInterface 注解
java
@FunctionalInterface
interface Calculator {
int calculate(int a, int b);
}
// 使用
Calculator add = (a, b) -> a + b;
Calculator multiply = (a, b) -> a * b;
三、Stream API
处理集合数据的流式操作
java
List<String> list = Arrays.asList("a", "b", "c", "d");
// 过滤、映射、收集
List<String> result = list.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.collect(Collectors.toList());
// 并行流处理
long count = list.parallelStream()
.filter(s -> s.length() > 0)
.count();
四、方法引用
简化 Lambda 表达式
java
// 四种方法引用形式
// 1. 静态方法引用
Function<String, Integer> parser = Integer::parseInt;
// 2. 实例方法引用
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println);
// 3. 对象方法引用
String str = "Hello";
Supplier<Integer> lengthSupplier = str::length;
// 4. 构造器引用
Supplier<List<String>> listSupplier = ArrayList::new;
五、Optional 类
解决空指针异常
java
Optional<String> optional = Optional.ofNullable(getString());
// 安全操作
optional.ifPresent(System.out::println);
String value = optional.orElse("default");
// 链式调用
optional.map(String::toUpperCase)
.filter(s -> s.length() > 0)
.orElse("empty");
六、新的日期时间 API
位于 java.time 包下
java
// 日期
LocalDate today = LocalDate.now();
LocalDate specificDate = LocalDate.of(2024, 1, 20);
// 时间
LocalTime currentTime = LocalTime.now();
// 日期时间
LocalDateTime now = LocalDateTime.now();
// 时区
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
// 时间差
Duration duration = Duration.between(startTime, endTime);
Period period = Period.between(startDate, endDate);
七、接口的默认方法和静态方法
java
interface Vehicle {
// 默认方法
default void print() {
System.out.println("I am a vehicle!");
}
// 静态方法
static void blowHorn() {
System.out.println("Blowing horn!");
}
}
interface FourWheeler {
default void print() {
System.out.println("I am a four wheeler!");
}
}
// 解决多重继承冲突
class Car implements Vehicle, FourWheeler {
@Override
public void print() {
Vehicle.super.print(); // 显式调用指定接口的默认方法
FourWheeler.super.print();
}
}
八、Nashorn JavaScript 引擎
java
ScriptEngine engine = new ScriptEngineManager()
.getEngineByName("nashorn");
engine.eval("print('Hello Nashorn!');");
九、并行数组
java
int[] array = new int[10000];
Arrays.parallelSetAll(array, i -> i * 2);
Arrays.parallelSort(array);
十、重复注解
java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Filters {
Filter[] value();
}
@Repeatable(Filters.class)
@interface Filter {
String value();
}
// 可以重复使用同一注解
@Filter("filter1")
@Filter("filter2")
class MyClass {}
十一、其他改进
- Base64 支持 :
java.util.Base64 - CompletableFuture:增强的异步编程
- StampedLock:改进的锁机制
- 并行累加器 :
DoubleAdder,LongAdder
使用示例
java
public class Java8Features {
public static void main(String[] args) {
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 35)
);
// Stream + Lambda + 方法引用
List<String> names = people.stream()
.filter(p -> p.getAge() > 25)
.map(Person::getName)
.sorted()
.collect(Collectors.toList());
}
}
这些特性极大地提升了 Java 的生产力,使代码更加简洁、可读性更强,并为函数式编程在 Java 中的应用奠定了基础。