JDK 1.8(Java 8)新特性详解
JDK 1.8(Java 8)新特性详解
JDK 1.8(代号 Spider)于2014年3月18日正式发布,是 Java 历史上最具里程碑意义的版本之一。引入了 Lambda 表达式、Stream API、全新的日期时间 API 等革命性特性,彻底改变了 Java 的编程范式——从面向对象迈向函数式编程。
目录
- Lambda 表达式与函数式接口
- 方法引用(Method Reference)
- Stream API
- Optional 类
- 接口默认方法与静态方法
- 全新日期时间 API(java.time)
- CompletableFuture 异步编程
- 新集合操作方式
- Base64 编解码
- Nashorn JavaScript 引擎
- 并行数组排序
- 重复注解与类型注解
- Spliterator
- HashMap 红黑树优化
- ConcurrentHashMap 重构
- LongAdder / LongAccumulator
- StampedLock
- 其他重要更新
- 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. 单参数(可省略括号)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()