Java函数式接口与Lambda表达式详解

需积分: 0 1 下载量 75 浏览量 更新于2024-08-05 收藏 556KB PDF 举报
"这篇学习笔记主要讲解了Java中的函数式接口和函数式编程,包括概念、格式、@FunctionalInterface注解、自定义函数式接口的使用,以及Lambda表达式的初步介绍。" 在Java中,函数式接口是一个重要的概念,它指的是只有一个抽象方法的接口。这种接口的设计目的是为了支持函数式编程,特别是与Lambda表达式配合使用。Lambda表达式在Java中被视为一种“语法糖”,简化了匿名内部类的创建,使得代码更简洁,但其底层实现与匿名内部类有所不同。 函数式接口的定义格式通常是这样的: ```java 修饰符 interface 接口名称 { public abstract 返回值类型 方法名称(可选参数信息); // 其他非抽象方法内容 } ``` 由于public和abstract在接口中是默认的,所以这些关键字可以省略,简化为: ```java interface 接口名称 { 返回值类型 方法名称(参数信息); } ``` Java 8引入了`@FunctionalInterface`注解,用于明确表明一个接口是函数式接口。这个注解可以防止在接口中无意间添加额外的抽象方法,导致接口不再符合函数式接口的要求。不过,即使不使用此注解,只要接口中只有一个抽象方法,它依然可以作为函数式接口使用。 自定义函数式接口通常会用作方法的参数,允许我们将行为(函数)作为参数传递。例如,可以定义一个无参无返回值的接口: ```java @FunctionalInterface interface MyAction { void execute(); } ``` 然后在方法中使用这个接口: ```java public void doSomething(MyAction action) { action.execute(); } ``` 函数式编程在Java中意味着可以通过Lambda表达式和方法引用等方式,将函数作为一等公民处理。Lambda表达式具有延迟执行的特性,只有当需要调用时才会执行。它可以作为参数传递,也可以作为方法的返回值。例如,常见的函数式接口如`Supplier<T>`、`Consumer<T>`、`Function<T,R>`和`Predicate<T>`,分别代表无参数有返回值、有参数无返回值、有参数有返回值以及接受参数并返回布尔值的函数。 `Supplier<T>`接口常用来提供一个类型T的对象,没有输入参数,但返回一个T类型的值: ```java Supplier<String> supplier = () -> "Hello"; String value = supplier.get(); // "Hello" ``` `Consumer<T>`接口则用于消费一个T类型的参数,没有返回值: ```java Consumer<String> consumer = str -> System.out.println(str); consumer.accept("World"); // 打印 "World" ``` `Function<T,R>`接口允许我们将一个T类型转换为R类型: ```java Function<String, Integer> function = str -> str.length(); int length = function.apply("Lambda"); // 6 ``` `Predicate<T>`接口用于接收一个T类型的参数并返回一个布尔值: ```java Predicate<String> predicate = str -> str.isEmpty(); boolean isEmpty = predicate.test(""); // true ``` 通过Lambda表达式,我们可以更方便地处理这些函数式接口,使得代码更简洁、易读。函数式编程的引入,让Java在保持面向对象特性的同时,也拥有了处理函数式编程的能力,极大地丰富了编程范式,提高了代码的灵活性和复用性。