【并发编程篇】四大函数式接口


在这里插入图片描述

🛸函数型接口

⭐Function

java 中的 java.util.function.Function<T, R> 接口代表一个函数,该函数接受一个参数类型为 T 的输入,并返回一个结果类型为 R 的输出。在函数式编程中,Function 是一种被广泛应用的高阶函数,它可以被用于将数据转换为另一种形式,或者执行一些特定的计算逻辑。

从理论上来说,Function 接口体现了函数式编程中的一个核心概念:函数作为一等公民(first-class citizen)。这意味着函数可以像其他类型的值一样被传递、赋值、作为参数传递给其他函数,或者从函数中返回。Function 接口作为函数式编程中的函数表示,具有以下特点:

  • 纯函数性质:Function 接口中的抽象方法 R apply(T t) 定义了函数的输入和输出关系,其计算过程不应该依赖于除输入参数之外的任何其他状态。这符合函数式编程中的纯函数概念,即相同的输入永远产生相同的输出,且不会产生副作用。
  • 高阶函数:Function 接口本身是一个高阶函数,因为它可以接受其他函数作为参数,也可以返回另一个函数。这使得我们可以将逻辑抽象出来,实现更灵活的代码组织和复用。
  • 组合和变换:Function 接口提供了多个默认方法,比如 andThen 和 compose,用于将多个 Function 组合起来,形成一个新的 Function。这使得我们可以轻松地对数据进行多次变换和组合。

在实际应用中,Function 接口通常与 Stream API 一起使用,用于对集合中的元素进行映射、过滤和转换操作。通过将数据处理逻辑抽象成 Function 对象,我们可以实现更加模块化、灵活和可复用的代码。

总之,Function 接口体现了函数式编程的核心理念,使得函数成为程序开发中的一等公民,能够以一种更加灵活和抽象的方式来处理数据和逻辑。

Function的源码
在这里插入图片描述

下面我们写代码,可以根据源码提供的参数来写

在这里插入图片描述

package org.Function;

import java.util.function.Function;

public class Demo01 {
    public static void main(String[] args) {

        Function function=new Function<String,String>(){
            @Override
            public String apply(String str){
                return str;
            }
        };
        
        System.out.println(function.apply("hello"));
    }
}

🎈使用lambda表达式进行简化

在这里插入图片描述

⭐Predicate

Predicate 接口其实是函数式编程中的一种高阶函数(higher-order function)的体现。在函数式编程中,我们可以将函数看作一种对象,可以将其作为参数传递给其他函数,或者从函数中返回另一个函数。

Predicate 接口就是一种可以作为参数传递的函数对象。它的 test() 方法接收一个输入类型为 T 的对象,并返回一个布尔值表示是否符合某个条件。这个方法本身就是一个函数,只不过它被封装在 Predicate 接口中,以便于使用和组合。

Predicate 接口还提供了多个默认方法,用于组合多个 Predicate,形成更复杂的判断条件。这些方法本质上也是函数,只不过它们接收的参数是另一个 Predicate 对象。

通过使用 Predicate 接口,我们可以将数据处理和筛选的逻辑与具体的数据类型解耦。我们可以将判断条件抽象成一个独立的函数对象,然后将它作为参数传递给 Stream API 中的 filter() 方法,用于过滤列表中的元素。这种方式可以使代码更加清晰、简洁、可读,并且方便进行单元测试和模块化开发。

总之,Predicate 接口是函数式编程中的一种高阶函数,通过将判断条件抽象成函数对象,使得代码更加灵活、可复用、易于维护。

在这里插入图片描述

package org.Function;

import java.util.function.Predicate;

public class Demo02 {
    public static void main(String[] args) {
        //判断字符串是否为空
        Predicate<String> predicate=new Predicate<String>() {
            @Override
            public boolean test(String str) {
                return str.isEmpty();
            }
        };
        System.out.println(predicate.test("hello"));
    }
}

在这里插入图片描述

🎈使用lambda表达式进行简化

在这里插入图片描述

⭐Consumer

Consumer接口是函数式接口的一种,它基于函数式编程的理论和概念。函数式编程是一种编程范式,它将计算视为数学函数的求值,并强调使用纯函数和不可变数据来进行编程。

在函数式编程中,函数是一等公民,可以作为参数传递给其他函数或作为返回值返回。而函数式接口则是用来表示这种函数的接口。

Consumer接口代表一个接收单个参数并且没有返回值的操作。它定义了一个抽象方法accept,该方法接收一个参数并对其进行操作。由于Consumer接口只有一个抽象方法,因此它符合函数式接口的定义。

通过使用Consumer接口,可以将某个操作(函数)作为参数传递给其他方法或函数。这种灵活性使得代码更具可重用性和可组合性。

在函数式编程中,我们可以使用Consumer接口来构建复杂的操作链。例如,我们可以将多个Consumer对象按照一定的顺序连接起来,形成一个处理流水线。每个Consumer对象负责完成某个特定的操作,而整个流水线将按顺序执行这些操作。

这种函数式编程的思想使得代码更加模块化和易于理解。它将关注点集中在具体的操作上,而不是过程和状态的细节。同时,函数式编程还鼓励使用不可变数据和纯函数,从而提高代码的可测试性和并发性。

总之,Consumer接口是函数式编程的一部分,它基于函数作为一等公民的思想,用于表示接收单个参数并且没有返回值的操作。通过使用Consumer接口,可以实现更加模块化、灵活和可组合的代码。

在这里插入图片描述

package org.Test6;

import java.util.function.Consumer;

public class ConsumerDemo {
    public static void main(String[] args) {
         Consumer<String> consumer = new Consumer<String>() {
            @Override
            public void accept(String str) {
                System.out.println(str);
            }
        };

         consumer.accept("hello");

    }
}

在这里插入图片描述

🎈使用lambda表达式进行简化

在这里插入图片描述

⭐Supplier

在函数式编程中,Supplier 接口可以被视为一个封装了供应商(Supplier)角色的抽象。它是一个具有延迟计算特性的函数式接口,表示一个可能提供值的实体。

根据函数式编程的思想,函数是一等公民,可以被传递和操作。Supplier 接口的作用就是充当一个函数,它不接收任何参数,但返回一个值。

在计算机科学中,延迟计算指的是将计算推迟到真正需要结果的时候进行。这种延迟计算的方式可以提高性能和效率,因为它避免了不必要的计算。

Supplier 接口就像一个“计算工厂”,可以在需要的时候生成值。通过调用 get 方法,我们可以获取由 Supplier 提供的值,而无需传递任何参数。

这种延迟计算的特性使得 Supplier 接口在某些场景下非常有用。例如,当我们需要一个随机数、惰性加载配置或者生成无限序列时,可以使用 Supplier 接口来实现延迟计算。

总之,Supplier 接口是一个函数式编程中的概念,代表一个供应商的角色,它可以在需要的时候生成值。通过使用 get 方法,我们可以获取 Supplier 提供的值,而无需传递任何参数。这种延迟计算的特性使得 Supplier 接口在某些场景下非常有用,可以提高性能和效率。

在这里插入图片描述

package org.Test6;

import java.util.function.Supplier;

public class SupplierDemo {
    public static void main(String[] args) {
        Supplier supplier=new Supplier() {
            @Override
            public Object get() {
                System.out.println("get()");
                return 1024;
            }
        };
        System.out.println(supplier.get());
    }
}

在这里插入图片描述

🎈使用lambda表达式进行简化

在这里插入图片描述

Supplier:供给型接口:只返回,不输入
Consumer:消费性接口:只输入,不返回

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

在这里插入图片描述

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在下小吉.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值