Java 8 常用函数式接口及使用场景

1. Function<T, R>

  • 描述: 接受一个参数,返回一个结果。

  • 抽象方法: R apply(T t)

  • 使用场景: 数据转换、类型映射。

示例:

Function<String, Integer> lengthFunction = str -> str.length();
System.out.println(lengthFunction.apply("Hello")); // 输出 5

2. Consumer<T>

  • 描述: 接受一个参数,不返回结果。

  • 抽象方法: void accept(T t)

  • 使用场景: 执行某种操作,例如打印、记录日志。

示例:

Consumer<String> printConsumer = System.out::println;
printConsumer.accept("Hello World"); // 输出 Hello World

3. Supplier<T>

  • 描述: 不接受参数,返回一个结果。

  • 抽象方法: T get()

  • 使用场景: 延迟加载、生成对象或值。

示例:

Supplier<Double> randomSupplier = Math::random;
System.out.println(randomSupplier.get()); // 输出一个随机数

4. Predicate<T>

  • 描述: 接受一个参数,返回一个布尔值。

  • 抽象方法: boolean test(T t)

  • 使用场景: 条件判断、过滤数据。

示例:

Predicate<Integer> isEven = x -> x % 2 == 0;
System.out.println(isEven.test(4)); // 输出 true

5. BiFunction<T, U, R>

  • 描述: 接受两个参数,返回一个结果。

  • 抽象方法: R apply(T t, U u)

  • 使用场景: 两个值的组合或计算。

示例:

BiFunction<Integer, Integer, Integer> addFunction = (a, b) -> a + b;
System.out.println(addFunction.apply(5, 3)); // 输出 8

6. BinaryOperator<T>

  • 描述: 接受两个相同类型的参数,返回相同类型的结果。

  • 继承: 继承自 BiFunction<T, T, T>

  • 抽象方法: T apply(T t1, T t2)

  • 使用场景: 两个值的操作(如最大值、最小值)。

示例:

BinaryOperator<Integer> maxFunction = Integer::max;
System.out.println(maxFunction.apply(10, 20)); // 输出 20

7. UnaryOperator<T>

  • 描述: 接受一个参数,返回一个与输入类型相同的结果。

  • 继承: 继承自 Function<T, T>

  • 抽象方法: T apply(T t)

  • 使用场景: 对单个值的操作(如自增、自减)。

示例:

UnaryOperator<Integer> square = x -> x * x;
System.out.println(square.apply(5)); // 输出 25

8. BiConsumer<T, U>

  • 描述: 接受两个参数,不返回结果。

  • 抽象方法: void accept(T t, U u)

  • 使用场景: 同时处理两个值,例如记录日志。

示例:

BiConsumer<String, Integer> printBiConsumer = (name, age) -> 
    System.out.println(name + " is " + age + " years old");
printBiConsumer.accept("Alice", 25); // 输出 Alice is 25 years old

9. Comparator<T>

  • 描述: 用于比较两个对象。

  • 抽象方法: int compare(T o1, T o2)

  • 使用场景: 自定义排序。

示例:

Comparator<Integer> comparator = Integer::compare;
System.out.println(comparator.compare(10, 20)); // 输出 -1

扩展:函数式接口自定义

可以定义自己的函数式接口,只需要保证接口中只有一个抽象方法,并使用 @FunctionalInterface 注解。

示例:

@FunctionalInterface
interface MyFunctionalInterface {
    void execute(String message);
}
MyFunctionalInterface myFunc = message -> System.out.println(message);
myFunc.execute("Custom Functional Interface!"); // 输出 Custom Functional Interface!

总结表格

函数式接口抽象方法签名使用场景
Function<T, R>R apply(T t)用于将一种类型的数据转换为另一种类型,例如字符串转换为其长度、对象转换为其属性值等。
Consumer<T>void accept(T t)执行某些操作但不返回结果,例如打印日志、保存数据或发送通知。
Supplier<T>T get()用于提供一个结果,通常用于延迟计算、生成新对象或返回固定值。
Predicate<T>boolean test(T t)用于条件判断,常用于过滤集合、验证输入是否合法或检查某些条件是否成立。
BiFunction<T, U, R>R apply(T t, U u)处理两个输入值并生成一个结果,例如将两个数相加、两个字符串拼接或组合两个对象为新对象。
BinaryOperator<T>T apply(T t1, T t2)处理两个相同类型的值并生成一个相同类型的结果,例如计算两个数的最大值、最小值或相加。
UnaryOperator<T>T apply(T t)对单个值进行操作并返回一个相同类型的结果,例如自增、自减或对字符串进行转换操作。
BiConsumer<T, U>void accept(T t, U u)同时处理两个输入值但不返回结果,例如打印两个值的关系、记录两个参数的日志等。
Comparator<T>int compare(T o1, T o2)用于比较两个对象的大小,通常用于排序操作,例如对集合中的对象进行升序或降序排列。

### 回答1: Java 8 函数式接口是一种拥有单个抽象方法的接口,它可以被隐式地转换为 lambda 表达式。您可以使用 @FunctionalInterface 注解声明一个接口函数式接口。这样做可以帮助编译器检测到您是否正确地在接口中声明了单个抽象方法。 例如: ``` @FunctionalInterface public interface Converter<F, T> { T convert(F from); } ``` 这是一个函数式接口,因为它只有一个抽象方法 `convert()`。您可以使用 lambda 表达式来实现这个接口: ``` Converter<String, Integer> converter = (from) -> Integer.valueOf(from); Integer converted = converter.convert("123"); System.out.println(converted); // 123 ``` 函数式接口使用起来非常方便,因为它们可以被隐式地转换为 lambda 表达式。这使得您可以使用更简洁的代码来实现接口,而无需显式地创建一个类来实现该接口。 ### 回答2: Java 8引入了函数式接口,这是一种只有一个抽象方法的接口函数式接口提供了一种简洁的方式来定义Lambda表达式,Lambda表达式可以作为函数的参数使用函数式接口可以通过使用@FunctionalInterface注解来明确标识。这个注解是可选的,但建议使用,因为它可以确保接口只有一个抽象方法,防止不必要的错误。 Java 8提供了一些内置的函数式接口,用于处理常见的函数式编程场景。其中一些常用函数式接口包括: 1. Predicate(断言):代表一个谓词(布尔类型函数),接受一个参数,返回一个布尔值结果。 2. Consumer(消费者):代表一个消费者(接受一个参数并执行某些操作),接受一个参数,不返回任何结果。 3. Function(函数):代表一个函数(接受一个参数并返回一个结果),接受一个参数并返回一个指定类型的结果。 4. Supplier(供应者):代表一个供应者(不接受参数但返回一个结果),不接受任何参数,返回一个指定类型的结果。 这些函数式接口的引入使得Java 8具备了更强大的函数式编程能力,使代码更加简洁和易读。通过结合Lambda表达式和函数式接口,我们可以实现与函数式编程语言类似的编程风格,提高代码的可读性和可维护性。 ### 回答3: Java 8 引入了函数式接口的概念。函数式接口是一个只有一个抽象方法的接口。在 Java 8 之前,我们需要定义一个接口,并在其中添加一个抽象方法,才能够当作 Lambda 表达式的参数进行传递。而在 Java 8 中,我们只需使用 @FunctionalInterface 注解来标注一个接口,就可以将其定义为函数式接口了。这使得我们能够更加简洁地使用 Lambda 表达式。 函数式接口可以用来支持函数式编程,也可以用作 Lambda 表达式的类型。而 Java 8 为我们提供了一些内置的函数式接口,如 Function、Predicate、Consumer、Supplier 等。这些接口都定义了一些常用函数式方法,例如 Function 接口中的 apply() 方法,Predicate 接口中的 test() 方法。这些方法可以直接在 Lambda 表达式中使用。 通过使用函数式接口,我们可以更加方便地使用 Lambda 表达式来完成一些常见的操作。例如,我们可以使用 Predicate 接口来过滤集合中的元素,使用 Function 接口来对集合元素进行转换,使用 Consumer 接口来消费集合元素,使用 Supplier 接口来生产对象等等。 总之,Java 8函数式接口为我们提供了更加便捷的函数式编程方式。我们可以利用这些接口来定义、传递和使用 Lambda 表达式,从而简化代码,提高开发效率。同时,函数式接口也使得代码更加易读和易维护。然而,我们需要注意函数式接口的设计和使用,以避免出现意外的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值