JAVA中的函数接口,你都用过吗

这篇具有很好参考价值的文章主要介绍了JAVA中的函数接口,你都用过吗。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。

在这篇文章中,我们将通过示例来学习 Java 函数式接口。

函数式接口的特点

  1. 只包含一个抽象方法的接口称为函数式接口。
  2. 它可以有任意数量的默认静态方法,但只能包含一个抽象方法。它还可以声明对象类的方法。
  3. 函数接口也称为单一抽象方法接口或SAM 接口。
  4. 函数式接口只有在没有任何抽象方法时才可以扩展另一个接口。
  5. Java API 具有许多单方法接口,例如 Runnable、Callable、Comparator、ActionListener等。它们可以使用匿名类语法来实现和实例化。

接口示例

创建一个自定义的Sayable接口,这是一个使用@FunctionalInterface注解的函数式接口。
@FunctionalInterface注解表示该接口是一个函数式接口,并且只包含一个抽象方法。

自定义函数接口示例

@FunctionalInterface  
interface Sayable{  
    void say(String msg);   // abstract method   
}  

让我们通过main()方法来演示一个自定义的函数式接口。我们使用Lambda表达式来实现函数式接口。

public class FunctionalInterfacesExample {

    public static void main(String[] args) {

        Sayable sayable = (msg) -> {
            System.out.println(msg);
        };
        sayable.say("Say something ..");
    }
}

Predefined 函数接口

Java提供了Predefined的函数式接口,通过使用 lambda 和方法引用来处理函数式编程。

Predicate是检查条件的函数,它接受一个参数并返回boolean结果。

让我们来看一下Predicate接口的内部实现。

import java.util.function.Predicate;

public interface Predicate<T> {
    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        // 默认方法的实现
        return (t) -> test(t) && other.test(t);
    }

    // 其他默认方法和静态方法...
}

Predicate接口只包含一个抽象方法test(T t)同时它还包含默认方法和静态方法。

让我们创建一个示例来演示Predicate函数式接口的用法:

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 使用Predicate接口检查数字是否为偶数
        Predicate<Integer> evenNumberPredicate = number -> number % 2 == 0;
        System.out.println("Even numbers:");
        printNumbers(numbers, evenNumberPredicate);

        // 使用Predicate接口检查数字是否大于5
        Predicate<Integer> greaterThanFivePredicate = number -> number > 5;
        System.out.println("Numbers greater than 5:");
        printNumbers(numbers, greaterThanFivePredicate);
    }

    public static void printNumbers(List<Integer> numbers, Predicate<Integer> predicate) {
        for (Integer number : numbers) {
            if (predicate.test(number)) {
                System.out.println(number);
            }
        }
    }
}

Function 函数接口

Function函数接口是Java中的一个函数式接口,它定义了一个接收一个参数并返回结果的函数。它的定义如下:

@FunctionalInterface
public interface Function<T, R> {
    R apply(T t);
}

Function接口有两个泛型参数:T表示输入参数的类型,R表示返回结果的类型。它包含一个抽象方法apply(),接收一个类型为T的参数,并返回一个类型为R的结果。

Function接口常用于将一个值转换为另一个值,或者对输入值进行处理和计算。它可以被用于各种场景,如数据转换、映射、计算和处理等。

以下是一个使用Function函数接口的示例:

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        // 创建一个Function接口来将字符串转换为大写
        Function<String, String> uppercaseFunction = str -> str.toUpperCase();

        // 使用Function接口将字符串转换为大写
        String result = uppercaseFunction.apply("hello world");
        System.out.println(result);  // 输出: HELLO WORLD

        // 使用Function接口将字符串转换为其长度
        Function<String, Integer> lengthFunction = str -> str.length();
        int length = lengthFunction.apply("hello");
        System.out.println(length);  // 输出: 5
    }
}

Supplier 函数接口

Supplier用于表示一个提供(供应)结果的函数。它通常用于延迟计算或在需要时生成值。通过调用get()方法,我们可以获取由Supplier实例提供的结果。

以下是Consumer接口的实现

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

由于Supplier接口只有一个抽象方法,因此可以使用lambda表达式快速创建Supplier实例。下面是一个示例:

import java.util.Random;
import java.util.function.Supplier;

public class Main {
    public static void main(String[] args) {
        // 创建一个Supplier接口来生成随机整数
        Supplier<Integer> randomIntegerSupplier = () -> new Random().nextInt();

        // 使用Supplier接口生成随机整数
        int randomNumber = randomIntegerSupplier.get();
        System.out.println(randomNumber);

        // 创建一个Supplier接口来生成当前时间戳
        Supplier<Long> timestampSupplier = () -> System.currentTimeMillis();

        // 使用Supplier接口生成当前时间戳
        long timestamp = timestampSupplier.get();
        System.out.println(timestamp);
    }
}

Consumer 函数接口

Consumer用于表示接受一个参数并执行某些操作的函数。它定义了一个名为accept(T t)的抽象方法,接受一个参数,并且没有返回值。

以下是Consumer接口的简化版本

@FunctionalInterface
public interface Consumer<T> {
    void accept(T arg0);
}

Consumer接口适用于那些需要对传入的参数进行某种操作,而不需要返回结果的情况。它可以用于在不同的上下文中执行各种操作,如打印、修改状态、更新对象等。
下面是一个使用Consumer接口的示例:

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");

        // 使用Consumer接口打印每个名字
        Consumer<String> printName = name -> System.out.println(name);
        names.forEach(printName);

        // 使用Consumer接口修改每个名字为大写形式
        Consumer<String> uppercaseName = name -> {
            String uppercase = name.toUpperCase();
            System.out.println(uppercase);
        };
        names.forEach(uppercaseName);
    }
}

在上述示例中,我们创建了两个Consumer接口的实例。第一个printName用于打印每个名字,第二个uppercaseName用于将每个名字转换为大写形式并打印。

通过调用forEach()方法并传入相应的Consumer接口实例,我们可以对列表中的每个元素执行相应的操作。在示例中,我们对名字列表中的每个名字进行了打印和转换操作。

Consumer接口的使用场景包括遍历集合、处理回调函数、更新对象状态等。它提供了一种简洁的方式来执行针对输入参数的操作,使得代码更加清晰和模块化。

BiFunction 函数接口

BiFunction函数式接口表示接受两个参数并返回结果的函数。它定义了一个名为apply(T t, U u)的抽象方法,接受两个参数,并返回一个结果。

让我们来看一下BiFunction接口的简化版本。

@FunctionalInterface
public interface BiFunction<T, U, R> {
    R apply(T arg0, U arg1);
}

BiFunction接口适用于那些需要接受两个输入参数并产生结果的情况。它可以用于执行各种操作,如计算、转换、筛选等。
下面是一个使用BiFunction接口的示例:

import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {
        // 使用BiFunction接口计算两个数的和
        BiFunction<Integer, Integer, Integer> sumFunction = (a, b) -> a + b;
        int sum = sumFunction.apply(5, 3);
        System.out.println(sum);  // 输出: 8

        // 使用BiFunction接口将两个字符串拼接起来
        BiFunction<String, String, String> concatenateFunction = (str1, str2) -> str1 + str2;
        String result = concatenateFunction.apply("Hello, ", "World!");
        System.out.println(result);  // 输出: Hello, World!
    }
}

BiConsumer函数接口

BiConsumer接口,用于表示接受两个参数并执行某些操作的函数。它定义了一个名为accept(T t, U u)的抽象方法,接受两个参数,并且没有返回值。

以下是BiConsumer接口的简化版本:

import java.util.function.BiConsumer;

@FunctionalInterface
public interface BiConsumer<T, U> {
    void accept(T t, U u);
}

BiConsumer接口适用于那些需要对传入的两个参数进行某种操作,而不需要返回结果的情况。它可以用于在不同的上下文中执行各种操作,如打印、修改状态、更新对象等。
下面是一个使用BiConsumer接口的示例:

import java.util.function.BiConsumer;

public class Main {
    public static void main(String[] args) {
        // 使用BiConsumer接口打印两个数的和
        BiConsumer<Integer, Integer> sumPrinter = (a, b) -> System.out.println(a + b);
        sumPrinter.accept(5, 3);

        // 使用BiConsumer接口打印两个字符串的拼接结果
        BiConsumer<String, String> concatenationPrinter = (str1, str2) -> System.out.println(str1 + str2);
        concatenationPrinter.accept("Hello, ", "World!");
    }
}
那些库或中间件再用BiConsumer

BiPredicate 函数接口

BiPredicate接口用于表示接受两个参数并返回一个布尔值的函数。它定义了一个名为test(T t, U u)的抽象方法,接受两个参数,并返回一个布尔值。

以下是BiPredicate接口的简化版本:

@FunctionalInterface 
public interface BiPredicate<T, U> {
     boolean test(T t, U u);
     // Default methods are defined also
}

BiPredicate接口适用于那些需要对传入的两个参数进行某种条件判断,并返回布尔值的情况。它可以用于执行各种条件判断,如相等性比较、大小比较、复杂条件判断等。

下面是一个使用BiPredicate接口的示例:文章来源地址https://www.toymoban.com/news/detail-746626.html

import java.util.function.BiPredicate;

public class Main {
    public static void main(String[] args) {
        // 使用BiPredicate接口判断两个数是否相等
        BiPredicate<Integer, Integer> equalityPredicate = (a, b) -> a.equals(b);
        boolean isEqual = equalityPredicate.test(5, 5);
        System.out.println(isEqual);  // 输出: true

        // 使用BiPredicate接口判断一个字符串是否包含另一个字符串
        BiPredicate<String, String> containsPredicate = (str1, str2) -> str1.contains(str2);
        boolean isContains = containsPredicate.test("Hello, World!", "World");
        System.out.println(isContains);  // 输出: true
    }
}

到了这里,关于JAVA中的函数接口,你都用过吗的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 8大最强路由器排行 你用过吗

    随着路由器的普及,市面上的路由器品牌也越来越多了,到底哪个品牌的路由器更好呢?根据近年来受消费者信赖和喜欢的品牌,以下介绍八个路由器品牌,快来看看你家的在不在里面! D-Link友讯 TP-LINK H3C 华为HUAWEI 思科CISCO 腾达路由器 Netcore磊科 水星MERCURY 网速的好坏很大

    2024年02月08日
    浏览(65)
  • .NET几种微服务框架,你用过吗?

    最近有群友问,.NET有哪些微服务框架?.NET的微服务框架还真不多,一般企业都会自己搭建微服务框架,或者基于其它框架搭建微服务(比如abp)。本文将介绍几种微服务框架,供大家学习参考。 一、Service Fabric 简介: Service Fabric 是一个微服务框架,它由微软开发并托管在

    2024年02月03日
    浏览(34)
  • C++面试八股文:std::deque用过吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第26面: 面试官: deque 用过吗? 二师兄:说实话,很少用,基本没用过。 面试官:为什么? 二师兄:因为使用它的场景很少,大部分需要性能、且需要自动扩容的时候使用 vector ,需要随机插入和删除的时候可以使用 list 。

    2024年02月11日
    浏览(36)
  • 相见恨晚,这6个适合安卓用户的浏览器,你用过吗

    每个人手机里面有一款浏览器,当我们遇到问题的时候,可以打开浏览器搜索自己想要的答案。如果选用的手机浏览器不好,那么手机上可能会被安装很多垃圾软件。下面,和大家聊聊几款好用、适合安卓用户的浏览器,个人觉得这些浏览器非常香,有种相见恨晚的感觉。

    2024年02月03日
    浏览(36)
  • 【面试题】关于JavaScript实现继承的六大方案,你都了解过吗?

    ​ 前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库  web前端面试题库 VS java后端面试题库大全 面试官:“你说说 JavaScript 中实现继承有哪几种方法?” 紧张的萌新:“额,class 中用 extends 实现继承,然后...没了...” 面试官:“...” ······ 想必绝大

    2024年02月02日
    浏览(32)
  • Java中的基本容器知识你真的了解过吗?

    前言 :尽量使用简单易懂的通俗语言让大家初步了解各个重要的知识点。 博学之,审问之,慎思之,明辨之,笃行之。     Collection容器其实是用来存储独立元素的各种数据结构,如图所示。主要是Set、List、Queue等数据结构,又分为不同的分支具有部分不同的属性和特性。

    2024年02月03日
    浏览(27)
  • 常用Java代码-Java中的Lambda表达式和函数式接口

    Java中的Lambda表达式和函数式接口是Java 8中引入的一种新特性,允许编写简洁、可读性强的代码。Lambda表达式允许将简单的代码块作为参数传递给函数,而函数式接口则是一种只有一个抽象方法的接口,可以用于定义Lambda表达式。 下面是一个Lambda表达式的示例: 在这个例子中

    2024年01月18日
    浏览(40)
  • 学习C这么久了,main函数的这三个参数你见过吗?

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 Linux从入门到精通 ,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

    2024年02月05日
    浏览(30)
  • 『Linux从入门到精通』第 ⑮ 期 - main函数的三个参数你见过吗?

    🌸作者简介: 花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。 🌸 专栏简介:本文收录于 Linux从入门到精通 ,本专栏主要内容为本专栏主要内容为Linux的系统性学习,专为小白打造的文章专栏。

    2024年02月16日
    浏览(28)
  • Java的三大版本,你有了解过吗?

    目录 一、JavaSE 二、JavaME 三、JavaEE   JavaSE是Java平台的标准版,它提供了Java语言的核心API和基本功能,适用于开发普通的桌面应用程序、命令行工具和服务器端应用程序等。下面是一个简单的JavaSE代码示例: 这是一个经典的JavaSE示例,它定义了一个公共类 HelloWorld ,其中包含

    2024年02月03日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包