1. Lambda表达式
Lambda表达式提供了一种简洁的方式来实现接口的单个抽象方法,通常用于替代匿名类。
示例:
List<String> names = Arrays.asList("peterF", "anna", "mike", "xenia");
Collections.sort(names, (a, b) -> b.compareTo(a));
在上述代码中,lambda表达式替代了匿名比较器,实现了对字符串列表的降序排序。
2. 函数式接口
函数式接口是仅包含一个抽象方法的接口,Java 8引入了@FunctionalInterface注解来确保这一点。
示例:
@FunctionalInterface
interface Converter<F, T> {T convert(F from);
}
Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted); // 123
3. 方法引用和构造器调用
方法引用使用::
符号,可以引用静态方法、实例方法以及构造函数。
示例:
Converter<String, Integer> converter = Integer::valueOf;
PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
4. Stream API
Stream API用于处理集合类,可以执行过滤、排序、映射等操作,并且可以串行或并行执行。
示例:
List<String> stringCollection = new ArrayList<>();
stringCollection.add("ddd2");
stringCollection.add("aaa2");
stringCollection.add("bbb1");stringCollection.stream().filter(s -> s.startsWith("a")).forEach(System.out::println); // aaa2
5. 接口中的默认方法和静态方法
Java 8允许在接口中定义默认方法和静态方法。
示例:
interface Formula {double calculate(int a);default double sqrt(int a) {return Math.sqrt(a);}
}
Formula formula = (a) -> sqrt(a * 100);
System.out.println(formula.calculate(100)); // 100.0
System.out.println(formula.sqrt(16)); // 4.0
6. 新时间日期API
Java 8引入了全新的时间日期API,提供了更简洁且更安全的日期和时间操作类。
主要类和示例:
Instant
代表时间戳LocalDate
代表日期,例如2020-01-14LocalTime
代表时刻,例如12:59:59LocalDateTime
代表具体时间 2020-01-12 12:22:26ZonedDateTime
代表带时区的完整时间
示例:
LocalDate today = LocalDate.now();
LocalTime now = LocalTime.now();
LocalDateTime now = LocalDateTime.now();
ZonedDateTime zonedNow = ZonedDateTime.now();
7. 并行Streams
Stream可以通过并行处理来提升性能,只需调用parallelStream()
即可。
示例:
List<String> values = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {values.add(UUID.randomUUID().toString());
}long t0 = System.nanoTime();
long count = values.parallelStream().sorted().count();
long t1 = System.nanoTime();