JDK 1.8(Java 8)新特性详解

📅 2026/7/13 16:49:34 👁️ 阅读次数 📝 编程学习
JDK 1.8(Java 8)新特性详解

JDK 1.8(Java 8)新特性详解

JDK 1.8(代号 Spider)于2014年3月18日正式发布,是 Java 历史上最具里程碑意义的版本之一。引入了 Lambda 表达式、Stream API、全新的日期时间 API 等革命性特性,彻底改变了 Java 的编程范式——从面向对象迈向函数式编程。


目录

  1. Lambda 表达式与函数式接口
  2. 方法引用(Method Reference)
  3. Stream API
  4. Optional 类
  5. 接口默认方法与静态方法
  6. 全新日期时间 API(java.time)
  7. CompletableFuture 异步编程
  8. 新集合操作方式
  9. Base64 编解码
  10. Nashorn JavaScript 引擎
  11. 并行数组排序
  12. 重复注解与类型注解
  13. Spliterator
  14. HashMap 红黑树优化
  15. ConcurrentHashMap 重构
  16. LongAdder / LongAccumulator
  17. StampedLock
  18. 其他重要更新
  19. JVM 层面改进
  20. 新特性速查总览表

1. Lambda 表达式与函数式接口

1.1 Lambda 表达式

Lambda 表达式是 JDK 1.8 最核心的特性,使 Java 支持了函数式编程能力。

语法格式

(parameters) -> expression (parameters) -> { statements; }

完整示例

publicclassLambdaDemo{publicstaticvoidmain(String[]args){// 1. 无参 LambdaRunnabler1=()->System.out.println("Hello Lambda");r1.run();// 2. 单参数(可省略括号)Consumer<String>printer=s->System.out.println(s);printer.accept("Hello World");// 3. 多参数Comparator<Integer>cmp=(a,b)->Integer.compare(a,b);System.out.println(cmp.compare(3,5));// -1// 4. 带代码块Comparator<String>lenCmp=(s1,s2)->{intdiff=s1.length()-s2.length();returndiff!=0?diff:s1.compareTo(s2);};// 5. Lambda 替代匿名内部类List<String>list=Arrays.asList("banana","apple","cherry");list.sort((a,b)->a.compareTo(b));System.out.println(list);// [apple, banana, cherry]// 6. Lambda 在集合遍历中的应用list.forEach(item->System.out.println(item));// 7. Lambda 闭包特性(捕获 effectively final 变量)Stringprefix="Item: ";list.forEach(item->System.out.println(prefix+item));}}

1.2 函数式接口(Functional Interface)

使用@FunctionalInterface注解标记,接口中只能有一个抽象方法。

// JDK 内置四大函数式接口// Predicate<T> : T -> boolean 断言// Function<T,R> : T -> R 转换// Consumer<T> : T -> void 消费// Supplier<T> : () -> T 生产importjava.util.function.*;publicclassFunctionalInterfaceDemo{publicstaticvoidmain(String[]args){// Predicate - 断言Predicate<Integer>isPositive=n->n>0;System.out.println(isPositive.test(5));// trueSystem.out.println(isPositive.test(-3));// false// Predicate 组合Predicate<Integer>isEven=n->n%2==0;Predicate<Integer>isPositiveEven=isPositive.and(isEven);System.out.println(isPositiveEven.test(4));// trueSystem.out.println(isPositiveEven.test(-2));// false// Function - 转换Function<String,Integer>strLen=String::length;System.out.println(strLen.apply("Hello"));// 5// Function 链式调用Function<Integer,Integer>doubleIt=x->x*2;Function<Integer,Integer>addTen=x->x+10;Function<Integer,Integer>composed=doubleIt.andThen(addTen);System.out.println(composed.apply(5));// 20 (5*2+10)// Consumer - 消费Consumer<String>greet=name->System.out.println("Hello, "+name);greet.accept("Java");// Hello, Java// Supplier - 生产Supplier<Double>random=()->Math.random();System.out.println(random.get());// 0.xxxxx// 自定义函数式接口@FunctionalInterfaceinterfaceCalculator{intcalculate(inta,intb);}Calculatoradd=(a,b)->a+b;Calculatormultiply=(a,b)->a*b;System.out.println(add.calculate(3,4));// 7System.out.println(multiply.calculate(3,4));// 12}}

2. 方法引用(Method Reference)

方法引用是 Lambda 表达式的简写形式,使用::运算符。

publicclassMethodReferenceDemo{publicstaticvoidmain(String[]args){List<String>names=Arrays.asList("Alice","Bob","Charlie","David");// 1. 静态方法引用: ClassName::staticMethodFunction<String,Integer>parseInt=Integer::parseInt;System.out.println(parseInt.apply("123"));// 123// 2. 实例方法引用(特定对象): instance::methodStringstr="Hello World";Supplier<String>toUpper=str::toUpperCase;System.out.println(toUpper.get());// HELLO WORLD// 3. 实例方法引用(任意对象): ClassName::method// 等价于 (s) -> s.toUpperCase()names.stream().map(String::toUpperCase).forEach(System.out::println);// 4. 构造方法引用: ClassName::newSupplier<List<String>>listSupplier=ArrayList::new;List<String>list=listSupplier.get();list.add("test");System.out.println(list);// [test]// 5. 数组构造引用: Type[]::newFunction<Integer,String[]>arrayCreator=String[]::new;String[]arr=arrayCreator.apply(5);System.out.println(arr.length);// 5// 6. 实际应用:对象列表排序List<Person>people=Arrays.asList(newPerson("Alice",30),newPerson("Bob",25),newPerson("Charlie",35));// 按年龄排序people.sort(Comparator.comparingInt(Person::getAge));people.forEach(p->System.out.println(p.getName()+": "+p.getAge()));// Bob: 25, Alice: 30, Charlie: 35// 按名字排序people.sort(Comparator.comparing(Person::getName));people.forEach(p->System.out.println(p.getName()+": "+p.getAge()));// Alice: 30, Bob: 25, Charlie: 35}staticclassPerson{privateStringname;privateintage;Person(Stringname,intage){this.name=name;this.age=age;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}}}

3. Stream API

Stream API 是 JDK 1.8 另一个里程碑特性,提供了声明式的数据处理方式。

3.1 Stream 创建

publicclassStreamCreationDemo{publicstaticvoidmain(String[]args){// 1. 从集合创建List<String>list=Arrays.asList("a","b","c");Stream<String>s1=list.stream();// 顺序流Stream<String>s2=list.parallelStream();// 并行流// 2. 从数组创建String[]arr={"x","y","z"};Stream<String>s3=Arrays.stream(arr);Stream<String>s4=Arrays.stream(arr,0,2);// 指定范围// 3. 使用 Stream.of()Stream<String>s5=Stream.of("a","b","c");Stream<String>s6=Stream.of("hello");// 单元素流// 4. 空流Stream<String>s7=Stream.empty();// 5. 无限流 - iterate(种子 + 函数)Stream<Integer>s8=Stream.iterate(1,n->n*2);s8.limit(5).forEach(System.out::println);// 1, 2, 4, 8, 16// 6. 无限流 - generate(Supplier)Stream<Double>s9=Stream.generate(Math::random);s9.limit(3).forEach(System.out::println);// 7. 使用 IntStream / LongStream / DoubleStreamIntStream.range(1,6).forEach(System.out::println);// 1,2,3,4,5IntStream.rangeClosed(1,5).forEach(System.out::println);// 1,2,3,4,5LongStream.range(1L,5L).forEach(System.out::println);DoubleStream.of(1.1,2.2,3.3).forEach(System.out::println);// 8. 从文件读取(BufferedReader.lines())// try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {// reader.lines().forEach(System.out::println);// }}}

3.2 中间操作(Intermediate Operations)

publicclassStreamIntermediateDemo{publicstaticvoidmain(String[]args){List<String>words=Arrays.asList("Hello","World","Java","Stream","API","Hello");// 1. filter - 过滤words.stream().filter(w->w.length()>4).forEach(System.out::println);// Hello, World, Stream// 2. map - 映射转换words.stream().map(String::toUpperCase).forEach(System.out::println);// HELLO, WORLD, JAVA, ...// 3. flatMap - 扁平化映射List<List<String>>nested=Arrays.asList(Arrays.asList("a","b"),Arrays.asList("c","d"),Arrays.asList("e"));nested.stream().flatMap(List::stream).forEach(System.out::println);// a, b, c, d, e// 4. distinct - 去重words.stream().distinct().forEach(System.out::println);// Hello, World, Java, Stream, API// 5. sorted - 排序words.stream().sorted().forEach(System.out::println);// API, Hello, Hello, Java, Stream, World// 自定义排序words.stream().sorted(Comparator.comparingInt(String::length).reversed()).forEach(System.out::println);// Stream, Hello, World, Java, API, Hello// 6. peek - 调试/观察(不修改元素)words.stream().filter(w->w.length()>3).peek(w->System.out.println("Filtered: "+w)).map(String::toUpperCase).peek(w->System.out.println("Mapped: "+w)).collect(Collectors.toList());// 7. limit - 限制数量IntStream.iterate(1,n->n+1).limit(5).forEach(System.out::println);// 1, 2, 3, 4, 5// 8. skip - 跳过前N个IntStream.iterate(1,n->n+1).skip(3).limit(3).forEach(System.out::println);// 4, 5, 6// 9. 链式操作组合List<String>result=words.stream().distinct()// 去重.filter(w->w.length()>3)// 过滤长度>3.sorted(Comparator.reverseOrder())// 逆序.map(String::toLowerCase)// 转小写.collect(Collectors.toList());System.out.println(result);// [world, stream, java, hello]}}

3.3 终端操作(Terminal Operations)

importjava.util.*;importjava.util.stream.*;publicclassStreamTerminalDemo{publicstaticvoidmain(String[]args){List<Integer>numbers=Arrays.asList(1,2,3,4,5,6,7,8,9,10);// 1. forEach - 遍历numbers.stream().forEach(System.out::println);// 2. toArray - 转数组Integer[]arr=numbers.stream().toArray(Integer[]::new);// 3. collect - 收集(最常用)// 3.1 转 ListList<Integer>list=numbers.stream().collect(Collectors.toList());// 3.2 转 Set(去重)Set<Integer>set=numbers.stream().collect(Collectors.toSet()