JDK 1.8(Java 8)新特性详解JDK 1.8(代号 Spider)于2014年3月18日正式发布,是 Java 历史上最具里程碑意义的版本之一。引入了 Lambda 表达式、Stream API、全新的日期时间 API 等革命性特性,彻底改变了 Java 的编程范式——从面向对象迈向函数式编程。目录Lambda 表达式与函数式接口方法引用(Method Reference)Stream APIOptional 类接口默认方法与静态方法全新日期时间 API(java.time)CompletableFuture 异步编程新集合操作方式Base64 编解码Nashorn JavaScript 引擎并行数组排序重复注解与类型注解SpliteratorHashMap 红黑树优化ConcurrentHashMap 重构LongAdder / LongAccumulatorStampedLock其他重要更新JVM 层面改进新特性速查总览表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. 单参数(可省略括号)ConsumerStringprinter=s-System.out.println(s);printer.accept("Hello World");// 3. 多参数ComparatorIntegercmp=(a,b)-Integer.compare(a,b);System.out.println(cmp.compare(3,5));// -1// 4. 带代码块ComparatorStringlenCmp=(s1,s2)-{intdiff=s1.length()-s2.length();returndiff!=0?diff:s1.compareTo(s2);};// 5. Lambda 替代匿名内部类ListStringlist=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 内置四大函数式接口// PredicateT : T - boolean 断言// FunctionT,R : T - R 转换// ConsumerT : T - void 消费// SupplierT : () - T 生产importjava.util.function.*;publicclassFunctionalInterfaceDemo{publicstaticvoidmain(String[]args){// Predicate - 断言PredicateIntegerisPositive=n-n0;System.out.println(isPositive.test(5));// trueSystem.out.println(isPositive.test(-3));// false// Predicate 组合PredicateIntegerisEven=n-n%2==0;PredicateIntegerisPositiveEven=isPositive.and(isEven);System.out.println(isPositiveEven.test(4));// trueSystem.out.println(isPositiveEven.test(-2));// false// Function - 转换FunctionString,IntegerstrLen=String::length;System.out.println(strLen.apply("Hello"));// 5// Function 链式调用FunctionInteger,IntegerdoubleIt=x-x*2;FunctionInteger,IntegeraddTen=x-x+10;FunctionInteger,Integercomposed=doubleIt.andThen(addTen);System.out.println(composed.apply(5));// 20 (5*2+10)// Consumer - 消费ConsumerStringgreet=name-System.out.println("Hello, "+name);greet.accept("Java");// Hello, Java// Supplier - 生产SupplierDoublerandom=()-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){ListStringnames=Arrays.asList("Alice","Bob","Charlie","David");// 1. 静态方法引用: ClassName::staticMethodFunctionString,IntegerparseInt=Integer::parseInt;System.out.println(parseInt.apply("123"));// 123// 2. 实例方法引用(特定对象): instance::methodStringstr="Hello World";SupplierStringtoUpper=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::newSupplierListStringlistSupplier=ArrayList::new;ListStringlist=listSupplier.get();list.add("test");System.out.println(list);// [test]// 5. 数组构造引用: Type[]::newFunctionInteger,String[]arrayCreator=String[]::new;String[]arr=arrayCreator.apply(5);System.out.println(arr.length);// 5// 6. 实际应用:对象列表排序ListPersonpeople=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 APIStream API 是 JDK 1.8 另一个里程碑特性,提供了声明式的数据处理方式。3.1 Stream 创建publicclassStreamCreationDemo{publicstaticvoidmain(String[]args){// 1. 从集合创建ListStringlist=Arrays.asList("a","b","c");StreamStrings1=list.stream();// 顺序流StreamStrings2=list.parallelStream();// 并行流// 2. 从数组创建String[]arr={"x","y","z"};StreamStrings3=Arrays.stream(arr);StreamStrings4=Arrays.stream(arr,0,2);// 指定范围// 3. 使用 Stream.of()StreamStrings5=Stream.of("a","b","c");StreamStrings6=Stream.of("hello");// 单元素流// 4. 空流StreamStrings7=Stream.empty();// 5. 无限流 - iterate(种子 + 函数)StreamIntegers8=Stream.iterate(1,n-n*2);s8.limit(5).forEach(System.out::println);// 1, 2, 4, 8, 16// 6. 无限流 - generate(Supplier)StreamDoubles9=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){ListStringwords=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 - 扁平化映射ListListStringnested=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. 链式操作组合ListStringresult=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){ListIntegernumbers=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 转 ListListIntegerlist=numbers.stream().collect(Collectors.toList());// 3.2 转 Set(去重)SetIntegerset=numbers.stream().collect(Collectors.toSet()