当前位置: 首页 > news >正文

Java8新特性(详细版)

1. Lambda 表达式

  • 基本语法(parameters) -> expression(parameters) -> { statements; }。参数类型可省略,单参数时括号可省略,无参数用()表示。
  • 替代匿名内部类:可简洁地替代传统匿名内部类。
importjava.util.Arrays;importjava.util.List;publicclassLambdaSimpleExample{publicstaticvoidmain(String[]args){List<String>productNames=Arrays.asList("Phone","Laptop","Tablet");productNames.forEach(name->System.out.println(name));}}

2. 函数式接口

  • 定义:只包含一个抽象方法的接口,可用@FunctionalInterface注解确保定义符合要求。
  • 作用:为 Lambda 表达式提供目标类型。
@FunctionalInterfaceinterfaceProductTotalPriceCalculator{doublecalculateTotalPrice(doubleunitPrice,intquantity);}publicclassFunctionalInterfaceExample{publicstaticvoidmain(String[]args){ProductTotalPriceCalculatorcalculator=(unitPrice,quantity)->unitPrice*quantity;doubletotalPrice=calculator.calculateTotalPrice(99.99,5);System.out.println("Total price: "+totalPrice);}}

3. 常用函数式接口

Predicate 接口
  • 定义java.util.function.Predicate<T>接口有test方法,用于对输入参数判断,返回布尔值。
  • 应用场景:常用于过滤数据。
importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;publicclassPredicateExample{publicstaticvoidmain(String[]args){List<String>productNames=Arrays.asList("Phone","Laptop","Tablet","Mouse");Predicate<String>lengthFilter=name->name.length()>5;productNames.stream().filter(lengthFilter).forEach(System.out::println);}}
Consumer 接口
  • 定义java.util.function.Consumer<T>接口有accept方法,处理输入参数,无返回值。
  • 应用场景:常用于遍历集合处理元素。
importjava.util.Arrays;importjava.util.List;importjava.util.function.Consumer;publicclassConsumerExample{publicstaticvoidmain(String[]args){List<Double>productPrices=Arrays.asList(999.99,1999.99,499.99);Consumer<Double>priceConsumer=price->{doublepriceWithTax=price*1.1;System.out.println("Price with tax: "+priceWithTax);};productPrices.forEach(priceConsumer);}}
Function 接口
  • 定义java.util.function.Function<T, R>接口有apply方法,对输入参数转换,返回结果。
  • 应用场景:常用于数据转换。
importjava.util.Arrays;importjava.util.List;importjava.util.function.Function;importjava.util.stream.Collectors;publicclassFunctionExample{publicstaticvoidmain(String[]args){List<String>productNames=Arrays.asList("Phone","Laptop","Tablet");Function<String,String>toUpperCaseFunction=name->name.toUpperCase();List<String>upperCaseNames=productNames.stream().map(toUpperCaseFunction).collect(Collectors.toList());upperCaseNames.forEach(System.out::println);}}

4. 函数式接口对基本类型的处理

Java 提供专门针对基本类型的函数式接口,如IntPredicateDoubleConsumerLongFunction等,避免装箱和拆箱操作。

importjava.util.Arrays;importjava.util.IntSummaryStatistics;importjava.util.List;importjava.util.function.IntPredicate;importjava.util.stream.Collectors;importjava.util.stream.IntStream;publicclassPrimitiveFunctionalInterfaceExample{publicstaticvoidmain(String[]args){List<Integer>productQuantities=Arrays.asList(10,20,30,40);IntPredicatequantityFilter=quantity->quantity>20;IntSummaryStatisticsstats=productQuantities.stream().mapToInt(Integer::intValue).filter(quantityFilter).summaryStatistics();System.out.println("Average quantity: "+stats.getAverage());}}

5. 捕获 Lambda

Lambda 表达式可捕获外部变量,被捕获变量须是final或事实上的final

importjava.util.Arrays;importjava.util.List;publicclassCapturingLambdaExample{publicstaticvoidmain(String[]args){List<String>productNames=Arrays.asList("Phone","Laptop","Tablet");Stringprefix="Product: ";productNames.forEach(name->System.out.println(prefix+name));}}

6. 方法引用

  • 定义:更简洁的 Lambda 表达式,可直接引用已有方法。
  • 类型
    • 静态方法引用ClassName::staticMethodName
    • 实例方法引用instance::instanceMethodNameClassName::instanceMethodName(第一个参数作调用对象)
    • 对象方法引用Object::instanceMethodName
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassMethodReferenceExample{publicstaticvoidmain(String[]args){List<String>productNames=Arrays.asList("Phone","Laptop","Tablet");productNames.forEach(System.out::println);List<String>upperCaseNames=productNames.stream().map(String::toUpperCase).collect(Collectors.toList());upperCaseNames.forEach(System.out::println);}}

7. 引用构造方法

  • 语法ClassName::new
  • 作用:创建对象实例。
importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;classProduct{privateStringname;publicProduct(Stringname){this.name=name;}publicStringgetName(){returnname;}}publicclassConstructorReferenceExample{publicstaticvoidmain(String[]args){List<String>productNames=Arrays.asList("Phone","Laptop","Tablet");List<Product>products=productNames.stream().map(Product::new).collect(Collectors.toList());products.forEach(product->System.out.println(product.getName()));}}

8. 接口增强 - 默认方法

  • 定义:接口中用default关键字定义,有具体实现体。
  • 作用:不破坏现有实现类,向接口添加新方法。
  • 冲突解决:实现多接口且默认方法签名相同,需在实现类显式重写。
interfaceProduct{StringgetName();doublegetPrice();defaultdoublegetDiscountedPrice(){returngetPrice()*0.8;}}classElectronicProductimplementsProduct{privateStringname;privatedoubleprice;publicElectronicProduct(Stringname,doubleprice){this.name=name;this.price=price;}@OverridepublicStringgetName(){returnname;}@OverridepublicdoublegetPrice(){returnprice;}}publicclassDefaultMethodExample{publicstaticvoidmain(String[]args){Productproduct=newElectronicProduct("Phone",999.99);System.out.println("Discounted price: "+product.getDiscountedPrice());}}

9. 注解增强 - 可重复注解

  • 定义:允许在同一声明多次使用同一注解。
  • 使用方法:定义包含注解类型的容器注解,用@Repeatable注解指定容器注解。
importjava.lang.annotation.ElementType;importjava.lang.annotation.Repeatable;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Repeatable(Discounts.class)@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@interfaceDiscount{doublevalue();}@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@interfaceDiscounts{Discount[]value();}@Discount(0.1)@Discount(0.2)classProductWithDiscount{privateStringname;privatedoubleprice;publicProductWithDiscount(Stringname,doubleprice){this.name=name;this.price=price;}publicStringgetName(){returnname;}publicdoublegetPrice(){returnprice;}}publicclassRepeatableAnnotationExample{publicstaticvoidmain(String[]args){ProductWithDiscountproduct=newProductWithDiscount("Phone",999.99);Discount[]discounts=product.getClass().getAnnotationsByType(Discount.class);for(Discountdiscount:discounts){System.out.println("Discount: "+discount.value());}}}

10. Optional 类

  • 定义:容器类,包装可能为空的值,避免空指针异常。
  • 基本操作
    • 创建Optional.of()包含非空值,Optional.ofNullable()可能包含空值。
    • 检查值是否存在isPresent()
    • 获取值get()可能抛异常,建议用orElse()orElseGet()等。
importjava.util.Optional;classCustomer{privateStringname;publicCustomer(Stringname){this.name=name;}publicOptional<String>getName(){returnOptional.ofNullable(name);}}publicclassOptionalBasicExample{publicstaticvoidmain(String[]args){Customercustomer=newCustomer("John");Optional<String>nameOptional=customer.getName();if(nameOptional.isPresent()){System.out.println("Customer name: "+nameOptional.get());}else{System.out.println("Customer name is not available.");}StringdefaultName=nameOptional.orElse("Unknown");System.out.println("Customer name with default: "+defaultName);}}

11. 反射方法参数

Java 8 引入-parameters编译选项,可保留方法参数名称,用反射机制获取方法参数信息。

importjava.lang.reflect.Method;importjava.lang.reflect.Parameter;classProductService{publicvoidupdateProductPrice(StringproductId,doublenewPrice){// 业务逻辑}}publicclassReflectionMethodParameters{publicstaticvoidmain(String[]args)throwsNoSuchMethodException{Methodmethod=ProductService.class.getMethod("updateProductPrice",String.class,double.class);Parameter[]parameters=method.getParameters();for(Parameterparameter:parameters){System.out.println("Parameter name: "+parameter.getName());System.out.println("Parameter type: "+parameter.getType().getName());}}}
http://www.jsqmd.com/news/1302085/

相关文章:

  • 亚马逊ERP哪个最好用?从功能、稳定性、价格三维度分析
  • 实用笔记:成都线下黄金回收甄别方法,安心出手不被套路 - 日常比对手册
  • Android 集成 OpenCV 4.10.0:从依赖配置到基础使用
  • AI强化学习入门必读(90%新手忽略的4个数学底层陷阱)
  • AI推理路线图趋势——2025下半年投机采样与MoE推理的技术演进
  • B站尚硅谷张天禹老师课程配套笔记下载
  • 2026年最新勾花网/市政护栏/基坑护栏生产厂家核心竞争力解构 - 雷隆丝网值得关注 - 比奇堡111
  • 2026年精品礼盒产业链发展研究白皮书 嘉兴市新时代包装彩印有限公司 - 招财兔数字员工
  • ADAS方案设计-CAN网络管理与休眠唤醒机制
  • 【单片机课程设计/毕业设计】基于 STM32 的昼夜差异化出租车计价装置实现 基于 OLED 显示的车载速度里程计费终端设计(014101)
  • 13:分段函数
  • 7 月技术写作回顾:写了 310 篇文章,最重要的 10 个结论
  • 2026年秦皇岛迪奥包包回收指南:(185-3117-2838)海港区民族路94号赵掌柜二奢实体店一站式变现服务 - 赵掌柜二奢
  • 全自动焊线设备工艺参数对焊接品质的影响:从理论到实践的几点认识
  • 【问题】pg数据库在指定的schema中执行sql脚本
  • jQuery过滤器用法一篇详解
  • 2026年最新钢板网/基坑护栏/市政护栏生产厂家综合实力解析 - 雷隆丝网可圈可点 - 比奇堡111
  • OpenWork扩展开发工具链详解:提升开发效率的必备资源
  • 如何快速搭建跨平台TUIO模拟器:开发者的完整指南
  • 智慧楼宇多时间尺度能源调度系统设计与实现
  • 书生大模型提示词设计:L1级结构化实践指南
  • 2026年长春本地厨房设备厂家推荐 解决选型合规与售后痛点 - 甄选测评馆
  • 【通信AI商业化生死线】:为什么87%的POC项目止步于实验室?6个被忽视的交付临界点
  • 3小时从零到精通:Reloaded-II游戏模组加载器终极指南
  • 自己动手写一个spring之aop_2
  • FPGA中UART串口模块
  • 目前口碑出众的机器人视觉识别系统都有哪几款值得我们参考选择 - 甄选测评馆
  • 转大模型后,我为什么把权限和日志写得比 Prompt 还仔细
  • Anthropic 承认 Claude 在隔离测试中黑入三家组织:和 OpenAI 接连翻车,AI 安全测试的威胁模型正在失效
  • 阜阳专科毕业升本科,如何比较机构的服务完整度 - 精彩城市