Java笔记------JDK1.8的新特性之Lambda表达式

本文深入探讨Java中的Lambda表达式,一种允许代码作为数据传递的特性,以及函数式接口,仅包含一个抽象方法的接口。文章详细介绍了如何使用Lambda表达式简化代码,提高代码的灵活性和可读性,同时涵盖了Java提供的四大核心函数式接口:Consumer、Supplier、Function和Predicate,以及其他常用的函数式接口如BiFunction和UnaryOperator。

Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

使用匿名内部类来创建接口的一个子类对象
        MyInterface myInterface = new MyInterface() {
            @Override
            public void show(int a, int b) {
                System.out.println(a + b);
            }
        };
        myInterface.show(10, 20);
  使用Lambda表达式来创建接口的一个子类对象    
		 MyInterface myInterface3 = (x, y) -> System.out.println(x + y);
		Lambda 表达式中的参数类型都是由编译器推断得出的。 Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。 Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”.

函数式接口

函数式接口的定义是: 只包含一个抽象方法的接口,称为函数式接口。
通过 Lambda 表达式来创建该接口的对象,我们可以在任意函数式接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口.

Java中提供的4大核心函数式接口

		函数式接口	                      参数类型	        返回类型	                                  用途
Consumer<T>消费型接口			      T					void				对类型为T的对象应用操作,包含方法:void accept(T t)																											                
Supplier<T>供给型接口				  无	                  T					返回类型为T的对象,包含方法: T get();
Function<T, R> 函数型接口			  T	                  R				对类型为T的对象应用操作,并返回结果。结果是R类型的对法: R apply(T t);象。包含方
Predicate<T> 断言型接口				  T	              boolean			确定类型为T的对象是否满足某约束,并返回boolean 值。包含方法boolean test(T t);

其他函数式接口

函数式接口	                           参数类型	               返回类型	                                                             用途 
BiFunction<T,U,R>				        T U					       R	                   对类型为 T, U 参数应用操作, 返回 R 类型的结果。 包含方法为R apply(T t, U u);

UnaryOperator<T>						 T                         T					对类型为T的对象进行一元运算, 并返回T类型的结果。 包含方法为T apply(T t);
(Function的子接口)
	
BinaryOperator<T>					     T T	                   T					对类型为T的对象进行二元运算, 并返回T类型的结果。 包含方法为T apply(T t1, T t2);
(BiFunction的子接口)

BiConsumer<T,U>					       	T U	                       void                	对类型为T, U 参数应用操作。 包含方法为void accept(T t, U u)

ToIntFunction<T>												  int
ToLongFunction<T>                         T	                      long					分 别 计 算 int 、 long 、double、 值的函数
ToDoubleFunction<T>											     double

IntFunction<R>							int
LongFunction<R>						    long					    R	               参数分别为int、 long、double 类型的函数
DoubleFunction<R>					   double

方法引用与构造器引用

方法引用其实是Lambda表达式的另一种写法,
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用.
注意:实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!
方法引用:使用操作符 “ ::” 将方法名和对象或类的名字分隔开来。
如下三种主要使用情况:
 对象::实例方法
 类::静态方法
 类::实例方法
		Consumer<String> consumer=System.out::println;
        BinaryOperator<Double> doubleBinaryOperator=Math::max;
        BiFunction<String, String, String> function5 = String::concat;
构造器引用
格式:ClassName::new
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数列表要与接口中抽象方法的参数列表一致!
		 BiFunction<String, Integer, Student> biFunction2 = (s, integer) -> new Student(s, integer);
        BiFunction<String, Integer, Student> biFunction3 = Student::new;

Java 8Java 17 的版本中引入了大量新特性,极大地提升了 Java 的表达能力、性能以及开发效率。以下是这些版本中主要新特性的总结,适用于学习和技术笔记。 ### 一、Java 8 新特性 Java 8 是一次重大更新,引入了许多现代编程语言的特性,主要包括: - **Lambda 表达式**:允许将函数作为参数传递,简化了集合操作和并发编程。 - **函数式接口**:仅包含一个抽象方法的接口,支持 Lambda 表达式作为函数式编程的基础。 - **方法引用**:通过 `ClassName::methodName` 或 `object::methodName` 的形式直接引用已有方法。 - **默认方法**:接口中可以包含默认实现的方法,使用 `default` 关键字修饰,解决了接口演进问题。 - **静态方法**:接口中也可以定义静态方法,便于工具方法的封装。 - **Stream API**:提供声明式的集合操作方式,支持链式调用,如 `filter`、`map`、`reduce` 等。 - **Optional 类**:用于避免空指针异常,鼓励更安全的代码风格。 - **新的日期时间 API(java.time)**:引入 `LocalDate`、`LocalTime`、`LocalDateTime` 等类,替代旧版 `Date` 和 `Calendar`,具有更好的线程安全性和易用性 [^3]。 ```java // 示例:Stream API 与 Lambda 表达式 List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); List<String> filtered = names.stream() .filter(name -> name.startsWith("A")) .map(String::toUpperCase) .toList(); ``` ### 二、Java 9 新特性 Java 9 引入了模块化系统,并增强了工具链和 API: - **模块系统(JPMS)**:通过 `module-info.java` 定义模块,提升大型系统的可维护性和安全性。 - **JShell(REPL)**:提供交互式命令行,方便快速测试 Java 代码片段。 - **接口私有方法**:允许接口中定义 `private` 方法,用于辅助默认方法实现。 - **HTTP/2 客户端(实验性)**:引入新的 HTTP 客户端 API,支持同步和异步请求 [^6]。 ### 三、Java 10 新特性 Java 10 增加了一些实用特性,提升开发效率: - **局部变量类型推断(var)**:允许使用 `var` 声明局部变量,编译器自动推断类型。 - **GC 改进**:引入并行 Full GC 的 G1 垃圾收集器。 - **统一垃圾回收接口**:为不同垃圾收集器提供统一接口,便于扩展 [^7]。 ```java // 示例:var 类型推断 var list = new ArrayList<String>(); list.add("Hello"); ``` ### 四、Java 11 新特性 Java 11 是一个长期支持版本(LTS),引入了多个增强功能: - **单文件源码执行(jshell-like)**:支持直接运行 `.java` 文件,无需显式编译。 - **HTTP Client API 增强**:支持同步和异步请求,支持 WebSocket。 - **字符串增强方法**:如 `isBlank()`, `lines()`, `repeat(n)` 等。 - **文件读写新方法**:如 `Files.writeString()` 和 `Files.readString()` [^8]。 ```java // 示例:Java 11 单文件执行 // 可以直接运行 java MyClass.java public class MyClass { public static void main(String[] args) { System.out.println("Hello from Java 11"); } } ``` ### 五、Java 12-14 新特性 这几个版本继续引入语言和工具链的小幅改进: - **Switch 表达式Java 12/13)**:支持返回值和简化语法,使用 `->` 替代 `:`。 - **文本块(Java 13)**:使用 `"""..."""` 定义多行字符串。 - **模式匹配(instanceof 类型匹配)(Java 14)**:简化类型判断与转换 [^9]。 ```java // 示例:switch 表达式 int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; case THURSDAY, SATURDAY -> 8; case WEDNESDAY -> 9; }; ``` ### 六、Java 15-17 新特性 这些版本进一步推进语言现代化和性能优化: - **密封类(Sealed Classes)(Java 15/17)**:限制类或接口的继承关系,增强封装性。 - **移除实验性 AOT/JIT 编译器(Java 16)**。 - **记录类(Records)(Java 16)**:简化不可变数据类的定义。 - **模式匹配增强(Java 16)**:支持 `switch` 中的类型匹配。 - **强封装 JDK 内部 API(Java 16)**:限制访问内部 JDK 类。 - **Vector API(孵化阶段)(Java 16)**:支持 SIMD 指令优化。 - **结构化并发(Structured Concurrency)(Java 19)**:简化多线程编程模型(虽为 Java 19,但影响后续版本设计) [^10]。 ```java // 示例:record 类型 record Point(int x, int y) {} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值