Java8中常见函数式接口的使用示例详解

 更新时间:2023年12月27日 08:11:24   作者:一只爱撸猫的程序猿  
在 Java 8 中,函数式接口是一个关键的特性,它们允许将方法作为参数传递或返回类型,本文为大家整理了一些常见的函数式接口的使用,希望对大家有所帮助

在 Java 8 中,函数式接口是一个关键的特性,它们允许将方法作为参数传递或返回类型,从而提高代码的模块性和灵活性。下面是一些常见的函数式接口的实例代码。

1. Consumer<T>

Consumer<T> 接口代表一个接受单个输入参数且不返回结果的操作。它常用于对对象执行操作。

import java.util.function.Consumer;

Consumer<String> printConsumer = System.out::println;
printConsumer.accept("Hello, World!");

2. Supplier<T>

Supplier<T> 接口提供一个没有参数的方法并返回一个泛型类型的结果。它通常用于延迟计算或构造。

import java.util.function.Supplier;

Supplier<Double> randomSupplier = Math::random;
System.out.println(randomSupplier.get());

3. Function<T,R>

Function<T,R> 接口表示接受一个参数并产生结果的函数。这是一个非常通用的接口。

import java.util.function.Function;

Function<String, Integer> lengthFunction = String::length;
System.out.println(lengthFunction.apply("Hello"));

4. Predicate<T>

Predicate<T> 接口表示一个参数的布尔值函数。

import java.util.function.Predicate;

Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty();
System.out.println(nonEmptyStringPredicate.test("Test"));

5.使用 Function<T,R> 进行函数组合

Function<Integer, Integer> times2 = e -> e * 2;
Function<Integer, Integer> squared = e -> e * e;

Function<Integer, Integer> times2AndSquare = times2.andThen(squared);
System.out.println(times2AndSquare.apply(4)); // 输出 64

6.使用 Predicate<T> 进行逻辑组合

Predicate<Integer> isEven = x -> x % 2 == 0;
Predicate<Integer> isPositive = x -> x > 0;

Predicate<Integer> isEvenAndPositive = isEven.and(isPositive);
System.out.println(isEvenAndPositive.test(4)); // true

7. UnaryOperator<T>

UnaryOperator<T> 是 Function<T, T> 的一个特例,用于操作单个操作数,其类型与结果类型相同。

import java.util.function.UnaryOperator;

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

8. BiFunction<T, U, R>

BiFunction<T, U, R> 接口表示接受两个参数并产生结果的函数。

import java.util.function.BiFunction;

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

9. BinaryOperator<T>

BinaryOperator<T> 是 BiFunction<T, T, T> 的一个特例,用于操作两个相同类型的操作数并返回相同类型的结果。

import java.util.function.BinaryOperator;

BinaryOperator<Integer> multiply = (a, b) -> a * b;
System.out.println(multiply.apply(3, 4)); // 输出 12

10.使用 Function<T, R> 创建工厂方法

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

class ComplexClass {
    private int value;

    ComplexClass(int value) {
        this.value = value;
    }

    // Getter and other methods...
}

Function<Integer, ComplexClass> complexClassFactory = ComplexClass::new;
ComplexClass complexInstance = complexClassFactory.apply(10);

11.UnaryOperator<T> 创建连续操作

UnaryOperator<String> toUpperCase = String::toUpperCase;
UnaryOperator<String> addExclamation = str -> str + "!";

UnaryOperator<String> shout = toUpperCase.andThen(addExclamation);
System.out.println(shout.apply("hello")); // 输出 "HELLO!"

12. BiConsumer<T, U>

BiConsumer<T, U> 接口表示接受两个输入参数的操作,并且不返回任何结果。

import java.util.function.BiConsumer;

BiConsumer<String, String> concatAndPrint = (a, b) -> System.out.println(a + b);
concatAndPrint.accept("Hello, ", "World!"); // 输出 Hello, World!

13. BiPredicate<T, U>

BiPredicate<T, U> 接口表示接受两个参数的布尔值函数。

import java.util.function.BiPredicate;

BiPredicate<Integer, String> validate = (i, s) -> i > 0 && s.startsWith("A");
System.out.println(validate.test(1, "Apple")); // 输出 true

14. ToIntFunction<T>

ToIntFunction<T> 接口表示将一个对象转换为一个原始 int 类型的函数。

import java.util.function.ToIntFunction;

ToIntFunction<String> length = String::length;
System.out.println(length.applyAsInt("Hello")); // 输出 5

通过这些特性,Java 8 的函数式接口极大地提升了代码的简洁性和可读性,同时也促进了函数式编程范式在 Java 社区中的普及。

到此这篇关于Java8中常见函数式接口的使用示例详解的文章就介绍到这了,更多相关Java8函数式接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springBoot mybatis 包扫描实例

    springBoot mybatis 包扫描实例

    这篇文章主要介绍了springBoot mybatis 包扫描实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • MyBatis-Flex实现多表联查(自动映射)

    MyBatis-Flex实现多表联查(自动映射)

    我们可以轻松的使用 Mybaits-Flex 链接任何数据库,本文主要介绍了MyBatis-Flex实现多表联查(自动映射),具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • Spring@Value属性注入使用方法解析

    Spring@Value属性注入使用方法解析

    这篇文章主要介绍了Spring@Value属性注入使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • @PathVariable和@RequestParam传参为空问题及解决

    @PathVariable和@RequestParam传参为空问题及解决

    这篇文章主要介绍了@PathVariable和@RequestParam传参为空问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Kotlin 标准函数和静态方法示例详解

    Kotlin 标准函数和静态方法示例详解

    这篇文章主要为大家介绍了Kotlin 标准函数和静态方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 到底如何设置Java线程池的大小的方法示例

    到底如何设置Java线程池的大小的方法示例

    在我们日常业务开发过程中,或多或少都会用到并发的功能。那么并发线程池到底设置多大呢?文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • IntelliJ IDEA(2020.2)的下载、安装步骤详细教程

    IntelliJ IDEA(2020.2)的下载、安装步骤详细教程

    这篇文章主要介绍了IntelliJ IDEA(2020.2)的下载、安装步骤详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java实现解数独的小程序

    Java实现解数独的小程序

    最近在学习Java,然后上个月迷上了九宫格数独,玩了几天,觉得实在有趣,就想着能不能用编程来解决,于是就自己写了个,还真解决了。下面这篇文章就给大家主要介绍了Java实现解数独的小程序,需要的朋友可以参考借鉴。
    2017-01-01
  • java 多线程的几种实现方法总结

    java 多线程的几种实现方法总结

    这篇文章主要介绍了java 多线程的几种实现方法总结的相关资料,希望通过本文能帮助到大家,让大家掌握java多线程的知识,需要的朋友可以参考下
    2017-10-10
  • springboot整合quartz实例demo

    springboot整合quartz实例demo

    Quartz是一个开源的任务调度框架。基于定时、定期的策略来执行任务是它的核心功能,比如x年x月的每个星期五上午8点到9点,每隔10分钟执行1次,本文重点给大家介绍springboot整合quartz的实例代码,感兴趣的朋友一起看看吧
    2022-02-02

最新评论