发布时间:2025-06-24 19:04:58 作者:北方职教升学中心 阅读量:287
时间日期API、更直观的时间处理。线程安全的类。可维护性和性能。
第11篇:Java 8 新特性及使用
Java 8 是一次里程碑式的更新,引入了多项革新特性,极大地提升了开发效率和代码表现力。
Consumer<String>print =s ->System.out.println(s);print.accept("Hello");
Supplier<T>
:无参数,返回一个值。Durationduration =Duration.between(startTime,endTime);
Period
:日期间隔(基于年、3.1 核心类
LocalDate
:日期(年月日)。- 善用Optional减少NPE:但避免滥用(如不要用于集合字段)。
Supplier<Double>random =Math::random;System.out.println(random.get());
Function<T, R>
:接收T类型参数,返回R类型。Optional类等核心特性出发,结合实战场景和最佳实践,全面解析Java 8的核心功能。
通过合理利用这些特性,可以显著提升代码质量、
1. Lambda表达式与函数式编程
1.1 Lambda表达式基础
Lambda表达式允许以简洁的语法实现函数式接口(仅含一个抽象方法的接口),替代传统的匿名内部类。
java.time
:替代Date
和Calendar
。LocalTimetime =LocalTime.parse("15:30:45");
LocalDateTime
:日期时间组合。日)。示例:集合处理
List<String>languages =Arrays.asList("Java","Python","C++","Go");// 过滤长度>3,转大写,排序,收集为ListList<String>result =languages.stream().filter(s ->s.length()>3).map(String::toUpperCase).sorted().collect(Collectors.toList());// 输出:[C++, GO, JAVA, PYTHON]
2.2 并行流加速处理
通过parallelStream()
利用多核CPU提升性能:
List<Integer>numbers =IntStream.range(1,10_000_000).boxed().collect(Collectors.toList());// 顺序流计算总和longsum1 =numbers.stream().mapToLong(Integer::longValue).sum();// 并行流计算总和longsum2 =numbers.parallelStream().mapToLong(Integer::longValue).sum();
2.3 常用收集器(Collectors)
- 转换为集合:
toList()
,toSet()
,toMap()
- 分组统计:
groupingBy()
,partitioningBy()
- 聚合计算:
summingInt()
,averagingDouble()
,maxBy()
示例:统计单词频率
List<String>words =Arrays.asList("apple","banana","apple","orange");Map<String,Long>frequency =words.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));// 输出:{apple=2, orange=1, banana=1}
3. 时间日期API(java.time)
Java 8 全新的时间日期API解决了旧版Date
和Calendar
的设计缺陷,提供不可变、
4.1 基本使用
Optional<String>optional =Optional.ofNullable(getName());// 存在值时执行操作optional.ifPresent(name ->System.out.println("Name: "+name));// 提供默认值Stringname =optional.orElse("Unknown");// 抛出异常Stringvalue =optional.orElseThrow(()->newIllegalArgumentException("值不能为空"));
4.2 链式操作
Optional<User>user =Optional.ofNullable(getUser());Stringstreet =user.map(User::getAddress).map(Address::getStreet).orElse("No street");
5. 接口默认方法与静态方法
Java 8 允许接口包含默认方法和静态方法,增强接口的扩展能力。
2.1 Stream操作分类
- 中间操作:返回新Stream,延迟执行(如
filter
,map
,sorted
)。5.1 默认方法
publicinterfaceVehicle{voidrun();defaultvoidhonk(){System.out.println("Beep beep!");}}publicclassCarimplementsVehicle{@Overridepublicvoidrun(){System.out.println("Car is running");}}
5.2 静态方法
publicinterfaceMathUtils{staticintadd(inta,intb){returna +b;}}intsum =MathUtils.add(3,5);// 8
6. 其他新特性
6.1 重复注解
允许在同一位置多次使用相同注解:
@Retention(RetentionPolicy.RUNTIME)public@interfaceRoles{Role[]value();}@Repeatable(Roles.class)public@interfaceRole{Stringvalue();}@Role("admin")@Role("user")publicclassUser{}
6.2 类型注解
注解可应用于任何类型(如泛型、
LocalDatedate =LocalDate.now();// 当前日期LocalDateindependenceDay =LocalDate.of(2023,Month.JULY,4);
LocalTime
:时间(时分秒)。- Lambda与Stream:函数式编程简化集合操作。
- Optional:优雅处理空值,减少NPE。
Function<String,Integer>length =String::length;System.out.println(length.apply("Java"));// 4
Predicate<T>
:接收T类型参数,返回布尔值。LocalDateTimedateTime =LocalDateTime.of(2023,12,31,23,59);
Duration
:时间间隔(基于时间单位)。- 接口增强:默认方法与静态方法提升灵活性。
- 终端操作:触发计算,关闭Stream(如
forEach
,collect
,count
)。Stream API、Predicate<Integer>isEven =n ->n %2==0;System.out.println(isEven.test(4));// true
- 静态方法引用:
ClassName::staticMethod
List<Integer>numbers =Arrays.asList(1,2,3);numbers.forEach(System.out::println);
- 实例方法引用:
instance::method
Stringstr ="Java";Supplier<Integer>length =str::length;
- 构造器引用:
ClassName::new
Supplier<List<String>>listSupplier =ArrayList::new;
8. 总结
Java 8 的革新特性为开发者提供了更强大的工具集:
1.3 方法引用
进一步简化Lambda表达式:
2. Stream API
Stream API 提供了一种声明式处理集合数据的方式,支持顺序和并行操作,极大简化了集合处理。本文将从 Lambda表达式、
List<@NonNullString>list =newArrayList<>();
6.3 方法参数反射
通过Parameter
类获取方法参数名(需编译时添加-parameters
参数):
publicvoidprintInfo(@NotNullStringname,intage){// ...}Methodmethod =User.class.getMethod("printInfo",String.class,int.class);Parameter[]parameters =method.getParameters();System.out.println(parameters[0].getName());// 输出name
7. 实战案例与最佳实践
案例1:使用Stream优化集合操作
// 传统写法List<String>filteredNames =newArrayList<>();for(Useruser :users){if(user.getAge()>18){filteredNames.add(user.getName());}}// Stream优化List<String>filteredNames =users.stream().filter(user ->user.getAge()>18).map(User::getName).collect(Collectors.toList());
案例2:时间日期计算
LocalDatetoday =LocalDate.now();LocalDatenextWeek =today.plusDays(7);Periodperiod =Period.between(today,nextWeek);System.out.println("间隔天数:"+period.getDays());// 7
最佳实践:
- 优先使用Lambda和Stream:简化代码,提升可读性。
Periodperiod =Period.between(startDate,endDate);
Consumer<T>
:接收一个参数,无返回值。
3.2 格式化与解析
DateTimeFormatterformatter =DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTimedateTime =LocalDateTime.parse("2023-08-25 14:30:00",formatter);Stringformatted =dateTime.format(formatter);// "2023-08-25 14:30:00"
4. Optional类
Optional
用于优雅处理null
值,避免空指针异常(NPE)。
语法结构:
(参数列表)->{代码逻辑 }
示例:线程创建对比
// 传统写法newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println("Thread running");}}).start();// Lambda简化newThread(()->System.out.println("Thread running")).start();
1.2 函数式接口
Java 8 内置了四大核心函数式接口: