Java8 新特性全解(保姆级) 本文介绍Java8 新特性。一、接口支持默认方法defaultJava8 允许接口里编写带具体实现的方法使用default关键字修饰优势接口版本迭代时不会破坏原有实现类代码拓展性更强// 定义学习行为接口publicinterfaceStudy{// 抽象方法由实现类重写voidlearn();// 默认方法自带实现逻辑defaultvoidplay(Stringname){System.out.println(我和name一起玩);}}// 接口实现类publicclassStudentimplementsStudy{// 重写抽象学习方法Overridepublicvoidlearn(){System.out.println(认真学习Java8);}}// 调用默认方法newStudent().play(小码哥);二、Lambda 表达式作用简化冗余的匿名内部类写法精简代码结构传统匿名内部类写法importjava.util.Arrays;importjava.util.Collections;importjava.util.List;importjava.util.Comparator;publicclassLambdaOldDemo{publicstaticvoidmain(String[]args){ListStringlistArrays.asList(peter,anna,mike);// 字符串集合倒序排序Collections.sort(list,newComparatorString(){Overridepublicintcompare(Stringa,Stringb){returnb.compareTo(a);}});}}Lambda精简写法importjava.util.Arrays;importjava.util.List;publicclassLambdaNewDemo{publicstaticvoidmain(String[]args){ListStringlistArrays.asList(peter,anna,mike);// lambda表达式实现排序逻辑Collections.sort(list,(a,b)-b.compareTo(a));}}进一步简化写法list.sort((a,b)-b.compareTo(a));三、函数式接口FunctionalInterface定义仅包含一个抽象方法的接口是Lambda表达式使用的前提注解用于编译校验格式合法性// 标记为函数式接口FunctionalInterfacepublicinterfaceConverterT,R{// 通用类型转换抽象方法Rconvert(Tfrom);}publicclassFuncInterfaceTest{publicstaticvoidmain(String[]args){// lambda实现字符串转数字ConverterString,Integercs-Integer.valueOf(s);Integernumc.convert(123);System.out.println(num);// 输出123}}四、方法引用::基于Lambda再次精简直接调用现有方法、构造方法静态方法引用// 引用Integer静态转换方法ConverterString,IntegercInteger::valueOf;实例方法引用publicclassDemo{// 截取字符串首字符publicStringfirst(Strings){returns.charAt(0);}publicstaticvoidmain(String[]args){DemodnewDemo();// 引用实例对象方法ConverterString,Stringcd::first;System.out.println(c.convert(Java));// 输出J}}构造器引用// 用户实体类classUser{Stringname;// 带参构造方法User(Stringname){this.namename;}}// 函数式工厂接口FunctionalInterfaceinterfaceUserFactory{Usercreate(Stringname);}publicclassConstructorRefTest{publicstaticvoidmain(String[]args){// 引用构造器创建对象UserFactoryfUser::new;Useruf.create(szxmg);}}五、Lambda 变量访问规则局部变量默认隐式final修饰不可二次赋值修改publicclassLambdaVarTest{publicstaticvoidmain(String[]args){intx1;// 使用外层局部变量运算ConverterInteger,Stringci-String.valueOf(ix);// x 2; 重新赋值会编译报错}}成员变量、静态变量支持读写操作Lambda内部无法直接访问接口默认方法六、四大内置函数式接口高频常用1. Predicate 断言判断接口返回布尔结果importjava.util.function.Predicate;publicclassPredicateDemo{publicstaticvoidmain(String[]args){// 判断字符串长度是否大于3PredicateStringps-s.length()3;System.out.println(p.test(java));// 输出true}}2. Function 类型转换接口入参出参不同importjava.util.function.Function;publicclassFunctionDemo{publicstaticvoidmain(String[]args){// 获取字符串长度FunctionString,Integerfs-s.length();System.out.println(f.apply(szxmg));// 输出5}}3. Consumer 消费接口只处理数据无返回值importjava.util.function.Consumer;publicclassConsumerDemo{publicstaticvoidmain(String[]args){// 打印拼接文本ConsumerStringcons-System.out.println(你好s);con.accept(双栈小码哥);}}4. Supplier 供给接口无入参只返回数据importjava.util.function.Supplier;importjava.util.Date;publicclassSupplierDemo{publicstaticvoidmain(String[]args){// 获取当前系统时间SupplierDatesupDate::new;System.out.println(sup.get());}}七、Stream 流简化集合操作链式完成筛选、排序、转换、统计等功能importjava.util.Arrays;importjava.util.List;importjava.util.Optional;publicclassStreamDemo{publicstaticvoidmain(String[]args){// 初始化测试集合数据ListStringlistArrays.asList(ddd2,aaa2,bbb1,aaa1,bbb3,ccc);// filter过滤以a开头的元素list.stream().filter(s-s.startsWith(a)).forEach(System.out::println);// sorted自然排序list.stream().sorted().forEach(System.out::println);// map字符统一转为大写list.stream().map(String::toUpperCase).forEach(System.out::println);// anyMatch判断是否存在指定开头元素booleanhasAlist.stream().anyMatch(s-s.startsWith(a));// count统计符合条件元素个数longcntlist.stream().filter(s-s.startsWith(b)).count();// reduce拼接所有元素字符串OptionalStringreslist.stream().reduce((s1,s2)-s1-s2);res.ifPresent(System.out::println);// parallelStream并行流多线程加速处理list.parallelStream().forEach(System.out::println);}}八、Map集合新增实用方法便捷实现不存在赋值、计算更新、合并数据等操作importjava.util.HashMap;importjava.util.Map;publicclassMapNewFuncDemo{publicstaticvoidmain(String[]args){MapInteger,StringmapnewHashMap();// 键不存在时才存入数据map.putIfAbsent(1,Java);// 根据键动态计算赋值map.computeIfAbsent(2,k-Python);// 合并相同键的字符串内容map.merge(1,8,String::concat);}}九、全新日期时间 APIjava.time替代老旧线程不安全的Date、Calendar类使用更简洁稳定importjava.time.LocalDate;importjava.time.LocalTime;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;publicclassTimeApiDemo{publicstaticvoidmain(String[]args){// 获取当前日期LocalDatetodayLocalDate.now();// 获取当前时分秒LocalTimenowLocalTime.now();// 获取完整日期时间LocalDateTimedtLocalDateTime.now();// 自定义时间格式化模板DateTimeFormatterfmtDateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss);// 格式化输出时间System.out.println(dt.format(fmt));}}十、重复注解Repeatable支持同一个位置多次添加相同类型注解importjava.lang.annotation.Repeatable;// 容器注解interfaceHints{Hint[]value();}// 可重复标记注解Repeatable(Hints.class)interfaceHint{Stringvalue();}// 同一类上重复使用注解Hint(a)Hint(b)classDemo{}总结Java8 核心知识点汇总接口 default 默认方法Lambda 表达式简化代码函数式接口规范定义方法引用进一步精简写法Stream流高效处理集合Map集合拓展操作方法线程安全的新日期API支持重复注解特性