)
1. Lambda 表达式基本语法(parameters) - expression或(parameters) - { statements; }。参数类型可省略单参数时括号可省略无参数用()表示。替代匿名内部类可简洁地替代传统匿名内部类。importjava.util.Arrays;importjava.util.List;publicclassLambdaSimpleExample{publicstaticvoidmain(String[]args){ListStringproductNamesArrays.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;doubletotalPricecalculator.calculateTotalPrice(99.99,5);System.out.println(Total price: totalPrice);}}3. 常用函数式接口Predicate 接口定义java.util.function.PredicateT接口有test方法用于对输入参数判断返回布尔值。应用场景常用于过滤数据。importjava.util.Arrays;importjava.util.List;importjava.util.function.Predicate;publicclassPredicateExample{publicstaticvoidmain(String[]args){ListStringproductNamesArrays.asList(Phone,Laptop,Tablet,Mouse);PredicateStringlengthFiltername-name.length()5;productNames.stream().filter(lengthFilter).forEach(System.out::println);}}Consumer 接口定义java.util.function.ConsumerT接口有accept方法处理输入参数无返回值。应用场景常用于遍历集合处理元素。importjava.util.Arrays;importjava.util.List;importjava.util.function.Consumer;publicclassConsumerExample{publicstaticvoidmain(String[]args){ListDoubleproductPricesArrays.asList(999.99,1999.99,499.99);ConsumerDoublepriceConsumerprice-{doublepriceWithTaxprice*1.1;System.out.println(Price with tax: priceWithTax);};productPrices.forEach(priceConsumer);}}Function 接口定义java.util.function.FunctionT, R接口有apply方法对输入参数转换返回结果。应用场景常用于数据转换。importjava.util.Arrays;importjava.util.List;importjava.util.function.Function;importjava.util.stream.Collectors;publicclassFunctionExample{publicstaticvoidmain(String[]args){ListStringproductNamesArrays.asList(Phone,Laptop,Tablet);FunctionString,StringtoUpperCaseFunctionname-name.toUpperCase();ListStringupperCaseNamesproductNames.stream().map(toUpperCaseFunction).collect(Collectors.toList());upperCaseNames.forEach(System.out::println);}}4. 函数式接口对基本类型的处理Java 提供专门针对基本类型的函数式接口如IntPredicate、DoubleConsumer、LongFunction等避免装箱和拆箱操作。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){ListIntegerproductQuantitiesArrays.asList(10,20,30,40);IntPredicatequantityFilterquantity-quantity20;IntSummaryStatisticsstatsproductQuantities.stream().mapToInt(Integer::intValue).filter(quantityFilter).summaryStatistics();System.out.println(Average quantity: stats.getAverage());}}5. 捕获 LambdaLambda 表达式可捕获外部变量被捕获变量须是final或事实上的final。importjava.util.Arrays;importjava.util.List;publicclassCapturingLambdaExample{publicstaticvoidmain(String[]args){ListStringproductNamesArrays.asList(Phone,Laptop,Tablet);StringprefixProduct: ;productNames.forEach(name-System.out.println(prefixname));}}6. 方法引用定义更简洁的 Lambda 表达式可直接引用已有方法。类型静态方法引用ClassName::staticMethodName实例方法引用instance::instanceMethodName或ClassName::instanceMethodName第一个参数作调用对象对象方法引用Object::instanceMethodNameimportjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;publicclassMethodReferenceExample{publicstaticvoidmain(String[]args){ListStringproductNamesArrays.asList(Phone,Laptop,Tablet);productNames.forEach(System.out::println);ListStringupperCaseNamesproductNames.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.namename;}publicStringgetName(){returnname;}}publicclassConstructorReferenceExample{publicstaticvoidmain(String[]args){ListStringproductNamesArrays.asList(Phone,Laptop,Tablet);ListProductproductsproductNames.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.namename;this.priceprice;}OverridepublicStringgetName(){returnname;}OverridepublicdoublegetPrice(){returnprice;}}publicclassDefaultMethodExample{publicstaticvoidmain(String[]args){ProductproductnewElectronicProduct(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.namename;this.priceprice;}publicStringgetName(){returnname;}publicdoublegetPrice(){returnprice;}}publicclassRepeatableAnnotationExample{publicstaticvoidmain(String[]args){ProductWithDiscountproductnewProductWithDiscount(Phone,999.99);Discount[]discountsproduct.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.namename;}publicOptionalStringgetName(){returnOptional.ofNullable(name);}}publicclassOptionalBasicExample{publicstaticvoidmain(String[]args){CustomercustomernewCustomer(John);OptionalStringnameOptionalcustomer.getName();if(nameOptional.isPresent()){System.out.println(Customer name: nameOptional.get());}else{System.out.println(Customer name is not available.);}StringdefaultNamenameOptional.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{MethodmethodProductService.class.getMethod(updateProductPrice,String.class,double.class);Parameter[]parametersmethod.getParameters();for(Parameterparameter:parameters){System.out.println(Parameter name: parameter.getName());System.out.println(Parameter type: parameter.getType().getName());}}}