引言
在这篇文章介绍一下JDK1.8的一些新特性。
开始
一、语言核心特性
Lambda 表达式
允许以简洁的方式实现函数式接口。
示例:
(a, b) -> a + b
替代匿名内部类。
函数式接口(Functional Interfaces)
使用
@FunctionalInterface
注解标记,仅含一个抽象方法(如Runnable
,Comparator
)。常见接口:
Predicate
,Consumer
,Function
,Supplier
。
方法引用(Method References)
简化 Lambda 表达式,直接引用现有方法。
示例:
System.out::println
或String::toUpperCase
。
接口的默认方法与静态方法
默认方法:用
default
关键字定义接口的默认实现,支持接口演化。静态方法:接口可定义静态工具方法(如
Comparator.comparing()
)。
二、集合与 Stream API
Stream API
提供函数式风格的数据处理(如过滤、映射、归约)。
示例:
java
list.stream() .filter(s -> s.startsWith("A")) .map(String::toLowerCase) .collect(Collectors.toList());
Optional 类
封装可能为
null
的值,避免空指针异常。方法:
ofNullable()
,orElse()
,ifPresent()
。
三、日期时间 API(JSR 310)
新包
java.time
:线程安全且设计清晰的日期时间类。核心类:
LocalDate
,LocalTime
,LocalDateTime
,ZonedDateTime
。工具类:
Duration
(时间间隔)、Period
(日期间隔)。
四、JVM 改进
元空间(Metaspace)替代永久代(PermGen)
元空间使用本地内存,减少
OutOfMemoryError
风险。
示例代码
// Lambda 表达式
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(s -> System.out.println(s));
// Stream API 操作
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream().filter(n -> n % 2 == 0).mapToInt(n -> n).sum();
// Optional 避免空指针
Optional<String> optional = Optional.ofNullable(getName());
String name = optional.orElse("default");
// 新日期 API
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusDays(7);