java8中常用函数式接口Supplier<T>、Consumer<T>、Function<T,R>、Predicate<T>使用示例

2023-11-11

场景

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

而java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。

下面介绍四个常用的函数式接口的使用示例。

这四个接口基本满足大部分的使用需求,当然还要其他函数式接口,可根据自己需要查询相关文档。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

Supplier<T> 供给型接口,返回值T

Supplier有get()方法,可以返回通用类型的值。

实例化Supplier有如下三种方法

1、通过Supplier接口实现方法,只有一个get方法,无参数,返回一个值

        Supplier<Integer> supplier = new Supplier<Integer>() {
            @Override
            public Integer get() {
                return new Random().nextInt();
            }
        };
        System.out.println(supplier.get());

2、通过lambda表达式

    List<Integer> integers = makeList(10, () -> (int) (Math.random() * 10));
    integers.forEach(System.out::println);

    private List<Integer> makeList(int num, Supplier<Integer> supplier){
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            list.add(supplier.get());
        }
        return list;
    }

3、通过方法引用

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

Supplier使用示例-求数组最大值

    @Test
    public void test2(){
        //求数组元素最大值
        int[] numbers = {1, 2, 3, 4, 5, 6};
        Integer integer = arrayMax(() -> {
            int max = numbers[0];
            for (int number : numbers) {
                if (max < number) {
                    max = number;
                }
            }
            return max;
        });
        System.out.println(integer);
    }

    private Integer arrayMax(Supplier<Integer> supplier) {
        return supplier.get();
    }

Supplier使用示例-若对象存在则返回,不存在则返回指定值或新建一个对象

        //Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
        Stream<Integer> integerStream = Stream.of(1, 2 );
        Optional<Integer> first = integerStream.filter(integer -> integer > 4).findFirst();
        Supplier<Integer> supplier = ()-> new Random().nextInt();
        //若是first中存在数,就返回这个数,若是不存在,就返回supplier返回的值
        System.out.println(first.orElseGet(supplier));

Consumer<T> 消费型接口,返回值void

Consumer相当于一个放东西的容器,你可以在这个容器里放有一个入参的代码块,然后返回T类型,

当调用accept(T)方法的时候才会去执行容器里的代码。

    @Test
    public void test4(){
        consumer(100,(o -> System.out.println("消费了"+o+"元")));
    }

    private void consumer(Object obj, Consumer<Object> consumer){
        consumer.accept(obj);
    }

Function<T,R>函数型接口,返回值R

    @Test
    public void test5(){
        String str = limitLength("公众号:霸道的程序猿,123456",s -> s.substring(0,10));
        System.out.println(str);
    }

    private String limitLength(String str, Function<String,String> function){
        return function.apply(str);
    }

Predicate<T>断定型接口,返回值boolean

    @Test
    public void test6(){
        boolean isTooLong = isTooLong("霸道的程序猿", (s -> s.length() > 5));
        System.out.println(isTooLong);
    }

    private boolean isTooLong(String str, Predicate<String> predicate){
        return  predicate.test(str);
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8中常用函数式接口Supplier<T>、Consumer<T>、Function<T,R>、Predicate<T>使用示例 的相关文章

随机推荐

  • C语言中不定参数函数

    在我们平常调用函数的时候 会进行传参 调用的函数也会有参数去接收 数量和类型都是对应的 而不定参数函数是指对一个函数传参 参数的个数可以不确定 接下来 我就简单的叙述一下不定参数函数的原理及应用 在我们刚学C语言的时候 大多会首先接触pri
  • 可变长参数 VS C++11 可变长模板

    转 https blog csdn net zj510 article details 36633603 C 可变长参数 VS C 11 可变长模板 2014年07月03日 13 50 32 阅读数 10437 有些时候 我们定义一个函数
  • fine-tuning(微调)的理解

    fine tuning 介绍 什么情况下使用微调 微调指导事项 不同数据集下使用微调 涉及到的其他知识 学习率 learning rate 卷积神经网络的核心 迁移学习与微调 什么是迁移学习 为什么要迁移学习 详细解释 自己的理解 不知道对
  • 分库分表设计方案

    一 为什么要分库分表 随着业务的不断发展 数据量不断增加 因此数据操作 如增删改查的开销也会越来越大 原来基于单库单表的设计已经不能满足存储需求 数据库随时面临爆库风险 再加上物理服务器的资源有限 CPU 磁盘 内存 IO 等 最终数据库所
  • 爬虫之selenium

    目录 selenium介绍 基本使用 selenium用法 元素操作 等待元素被加载 元素各项属性 执行js代码 切换选项卡 浏览器前进后退 无界面浏览器 xpath的使用 简单介绍 selenium中使用 异常处理 登录获取cookie保
  • Android 图片压缩二:

    public Bitmap zoomBitmap Bitmap bitmap int width int height int w bitmap getWidth int h bitmap getHeight Matrix matrix n
  • Asp.Net Core&CAP实现分布式事务

    需要注意的是标题中的CAP不是指的CAP理论 而是园区大神杨晓东实现的框架 CAP框架基于本地消息表用最终一致性实现分布式事务 本地消息表 首先我们考虑一个场景 在将用户信息更改后 需要发送一条消息到消息队列 缓存或是写入到其他库中 这个过
  • STM32F103ZET6【HAL函开发】STM32CUBEMX------II2C实验

    SCL和SDA都要接上拉电阻 起始信号 SCL为高 SDA由高变为低 停止信号 SCL为高 SDA由低变为高 数据有效性 SCL为高电平时 SDA数据有效 此时SDA为高电平时 表示数据为 1 为低电平时 表示数据为 0 当SCL为低电平时
  • Linus命令大全

    Linus命令是Linux操作系统中的一些常用命令 下面是一些常用的Linus命令 ls 用于显示当前目录中的文件和目录 cd 用于切换当前目录 pwd 显示当前目录的路径 mkdir 创建新目录 rm 删除文件或目录 cp 复制文件或目录
  • MoveIt入门之——使用MoveIt配置助手生成MoveIt配置文件

    一 安装MoveIt assistant sudo apt get install ros kinetic moveit 如果报错说找不到软件包 可能是没有更新源 只要去roswiki上找安装教程 把源重新加入就可以了 二 打开配置助手 r
  • npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法

    npm ERR code EPERM npm ERR syscall unlink npm ERR 错误解决方法 1 问题描述 2 解决方法 1 问题描述 由于之前电脑系统的原因 电脑重置了一下 之前安装的环境都没了 然后在重新安装node
  • 架构之重构的 12 条军规

    注 架构之重构的 12 条军规 上 发布以后 一些读者着急要下篇 所以在这里我把上下篇合并成一篇 让大家可以阅读完整版 不用分开看了 对于开发者来说 架构设计是软件研发过程中最重要的一环 所谓没有图纸 就建不了房子 在遍地 App 的互联网
  • 自学Python能做什么副业?通过这篇文章一起来看看

    很多小伙伴想在业余的时间自学一下python语言 但是又不知道python能够给自己带来什么 那么小编就通过这篇文章来和大家一起说说python学会了能做哪些副业 一 兼职处理数据 在目前的万物互联的时代下 越来越多的人离不开电脑 手机的办
  • 爬虫中的大哥大-scrapy框架介绍

    文章适合于所有的相关人士进行学习 各位看官看完了之后不要立刻转身呀 期待三连关注小小博主加收藏 小小博主回关快 会给你意想不到的惊喜呀 文章目录 scrapy介绍及安装 创建项目 创建爬虫 注意 如何运行 scrapy爬虫实战 1 sett
  • VMWare安装Ubuntu18时卡住

    VMWare安装Ubuntu18时卡住 今天安装Ubuntu时发现一直卡在 Started Network Manager Script Dispatcher Service 或者Mounting 的地方 由于点击安装之后没看 过了2小时看
  • Spring中获取Bean对象的三种注入方式和两种注入方法

    目录 前言 获取Bean对象的三种注入方式 属性注 构造 法注 Setter 注 属性注 构造 法注 和Setter 注 有什么区别呢 两种注入方法 Autowired 和 Resource Autowired 和 Resource 有什么
  • vue3 vite sass样式大量重复

    在vite config ts中配置 css preprocessorOptions 导入scss预编译程序 scss additionalData import assets scss variables scss import asse
  • Linux下修改IP、DNS、路由命令行设置

    一 快速修改 重启后设置就没了 ifconfig eth0 192 168 1 22 netmask 255 255 255 0 up route add default gw 192 168 1 2 二 修改配置文件 重启设置还在 一 u
  • LeetCode-2373. 矩阵中的局部最大值【矩阵,数组】

    LeetCode 2373 矩阵中的局部最大值 矩阵 数组 题目描述 解题思路一 原地修改 首先将每个3 3的矩阵的最大值存放在左上角的点 然后修改给的grid矩阵的大小 解题思路二 暴力 申请一个数组 解题思路三 0 题目描述 给你一个大
  • java8中常用函数式接口Supplier<T>、Consumer<T>、Function<T,R>、Predicate<T>使用示例

    场景 函数式接口 Functional Interface 就是一个有且仅有一个抽象方法 但是可以有多个非抽象方法的接口 而java中的函数式编程体现就是Lambda 所以函数式接口就是可以适用于Lambda使用的接口 下面介绍四个常用的函