【响应式编程-03】常见的函数式接口

一、简要描述

  • 使用Lambda的前提

        必须有一个函数式接口: 有且只有一个抽象方法的接口

        @FunctionnalInterface注解

  • 常见的函数式接口
    • Runnable / Callable
    • Supplier / Consumer
    • Comparator
    • Predicate
    • Function

二、代码实现

1、Runnable - RunnableLambda测试类

package tech.flygo.lambda.demo3;

/**
 * @description: Runnable Lambda测试类
 * @author: flygo
 * @time: 2023/5/13 19:52
 */
public class RunnableLambda {

    public static void main(String[] args) {
        // 实现匿名内部类的方式,实现多线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                String name = Thread.currentThread().getName();
                System.out.println(name + "线程已启动");
            }
        }).start();

        // 使用Lambda表达式,实现多线程
        new Thread(() -> {
            String name = Thread.currentThread().getName();
            System.out.println(name + "线程已启动");
        }).start();

        // 使用优化的Lambda实现多线程
        new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
    }
}

2、Supplier - SupplierLambda 测试类

package tech.flygo.lambda.demo3;

import java.util.function.Supplier;

/**
 * @description: 提供者Lambda测试类
 * @author: flygo
 * @time: 2023/5/13 20:05
 */
public class SupplierLambda {

    public static void main(String[] args) {
        int[] array = {3, 4, 8, 99, 444};

        // 调用getMax方法,参数传递Lambda
        int maxNum = getMax(() -> {
            int temp = array[0];

            // 查找数组的最大值
            for (int i : array) {
                if (temp < i) {
                    temp = i;
                }
            }
            return temp;
        });
        
        System.out.println(maxNum);
    }

    // 定义一个方法的参数传递Supplier传递使用泛型Integer
    public static int getMax(Supplier<Integer> supplier) {
        return supplier.get();
    }
}

3、Consumer - ConsumerLambda 测试类

package tech.flygo.lambda.demo3;

import java.util.function.Consumer;

/**
 * @description: 消费者Lambda测试类
 * @author: flygo
 * @time: 2023/5/13 20:21
 */
public class ConsumerLambda {

    public static void main(String[] args) {
//        consumerString(s -> System.out.println(s));

        consumerString(
                s -> System.out.println(s.toUpperCase()),
                s -> System.out.println(s.toLowerCase())
        );
    }

    static void consumerString(Consumer<String> consumer) {
        consumer.accept("Hello");
    }

    static void consumerString(Consumer<String> one, Consumer<String> two) {
        one.andThen(two).accept("Hello");
    }

}

4、Comparator - ComparatorLambda测试类

package tech.flygo.lambda.demo3;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @description: 比较器Lambda测试类
 * @author: flygo
 * @time: 2023/5/13 20:32
 */
public class ComparatorLambda {

    public static void main(String[] args) {
        String[] strs = {"adbc", "avc", "de", "dfafafdd"};

        // 使用匿名内部类的方式,实现比较器
        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.length() - o2.length();
            }
        };
        Arrays.sort(strs, comparator);
        System.out.println(Arrays.toString(strs));

        // 使用Lambda表达式实现
        Arrays.sort(strs, (o1, o2) -> o1.length() - o2.length());
        System.out.println(Arrays.toString(strs));

        Arrays.sort(strs, Comparator.comparingInt(String::length));
        System.out.println(Arrays.toString(strs));
    }
}

5、Predicate - PredicateLambda测试类

package tech.flygo.lambda.demo3;

import java.util.function.Predicate;

/**
 * @description: 断言Lambda测试类
 * @author: flygo
 * @time: 2023/5/13 22:10
 */
public class PredicateLambda {

    public static void main(String[] args) {
        // 与运算
        andMethod(s -> s.contains("H"), s -> s.contains("W"));
        // 或运算
        orMethod(s -> s.contains("H"), s -> s.contains("W"));
        // 非运算
        negateMethod(s -> s.length() < 5);
    }

    static void andMethod(Predicate<String> one, Predicate<String> two) {
        boolean isValid = one.and(two).test("Helloworld");
        System.out.println("字符串符合要求吗:" + isValid);
    }

    static void orMethod(Predicate<String> one, Predicate<String> two) {
        boolean isValid = one.or(two).test("HelloWorld");
        System.out.println("字符串符合要求吗:" + isValid);
    }

    static void negateMethod(Predicate<String> predicate) {
        boolean validLength = predicate.negate().test("HelloWorld");
        System.out.println("字符串很长吗?" + validLength);
    }
}

6、Function - FunctionLambda测试类

package tech.flygo.lambda.demo3;

import java.util.function.Function;

/**
 * @description: 函数Lambda测试类
 * @author: flygo
 * @time: 2023/5/13 22:21
 */
public class FunctionLambda {

    public static void main(String[] args) {

        // 传入的值为10,one Function 第一个 10 + 10 = 20,返回值20作为two函数的值进行处理 20 * 10 = 200
        method(s -> Integer.parseInt(s) + 10, i -> i * 10);
        
        String str = "张三,18";
        int age = getAgeNum(str, s -> s.split(",")[1],
                s -> Integer.parseInt(s),
                n -> n += 100);
        System.out.println(age);

    }

    static void method(Function<String, Integer> one, Function<Integer, Integer> two) {
        int num = one.andThen(two).apply("10");
        System.out.println(num + 20);
    }

    static int getAgeNum(String str, Function<String, String> one,
                         Function<String, Integer> two,
                         Function<Integer, Integer> three) {
        return one.andThen(two).andThen(three).apply(str);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/293599.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CloudCanal x Redis 数据同步指令集丰富与细节优化

简述 CloudCanal 前一段时间支持了 Redis 到 Redis 数据迁移同步能力&#xff0c;并支持其双向同步&#xff0c;但是支持的指令种类有限。 随着用户使用&#xff0c;指令支持不全面成为一个比较大的问题&#xff0c;所以最近的版本&#xff0c;我们对此能力&#xff0c;结合用…

695岛屿最大面积

题目 给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向相连&#xff08;对角线方向不相连&#xff09;。整个网格被水完全包围&#xff0c;但其中恰好有一个…

华为交换机如何同时配置多个端口参数

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 华为交换机如何批量配置端口 使用端口组功能可以实现一次配置多个端口,以减少重复配置工作。端口组分为如下两种方式: 永久端口组。如果用户需要多次…

系列三十三、如何将一个springboot jar做成批处理文件

一、将一个springboot jar做成批处理文件 1.1、需求 最近在写【Spring Cloud Alibaba】的系列文章&#xff0c;其中有一个部分是安装Sentinel控制台&#xff0c;使用命令执行完全没有问题&#xff0c;但是命令太长了&#xff0c;每次启动时都要找笔记&#xff0c;然后粘贴到命…

redis报错:Creating Server TCP listening socket 127.0.0.1:6379: bind: No error

Redis启动时报错&#xff1a; Creating Server TCP listening socket 127.0.0.1:6379: bind: No error 这个错误说明已经开启了redis&#xff0c;并且已经占用了端口6379&#xff0c;需要停止redis后再开启。 redis-cli.exeshutdownexitredis-server redis.windows.conf 参考…

面试官:CSS3新增了哪些新特性?

面试官&#xff1a;CSS3新增了哪些新特性&#xff1f; 一、是什么 css&#xff0c;即层叠样式表&#xff08;Cascading Style Sheets&#xff09;的简称&#xff0c;是一种标记语言&#xff0c;由浏览器解释执行用来使页面变得更美观 css3是css的最新标准&#xff0c;是向后兼…

用开源大语言模型开发的智能对话机器人初版原型验证

用开源大语言模型开发的智能对话机器人初版原型验证 0. 背景1. 初版检证效果展示2. 验证效果总结 0. 背景 同事要想做一个智能对话机器人&#xff0c;特别的需求有有些几点&#xff0c; 通过预置提示词&#xff08;包括确认事项&#xff09;&#xff0c;让大语言模型用会话式…

c# 学习笔记 - 枚举

文章目录 1. 枚举1.1 枚举结构梳理1.2 枚举完整代码1.3 枚举知识点补充 2. 迭代两种命名空间接口3. yield语句 1. 枚举 1.1 枚举结构梳理 结构图   上图内容可能依旧不通俗易懂&#xff0c;这里使用最简明的话语告诉大家实现方式. foreach语句就是集合的遍历操作&#xff0c…

Redis 有序集合(sorted set) 命令

目录 1.Redis Zrevrank 命令 - 返回有序集合中指定成员的排名&#xff0c;有序集成员按分数值递减(从大到小)排序简介语法可用版本: > 2.2.0返回值: 如果成员是有序集 key 的成员&#xff0c;返回成员的排名。 如果成员不是有序集 key 的成员&#xff0c;返回 nil 。 示例 2…

Linux_CentOS_7.9_MySQL_5.7配置数据库服务开机自启动之简易记录

前言&#xff1a; 作为运维保障&#xff0c;都无法准确预估硬件宕机的突发阶段&#xff0c;其生产数据实时在产出&#xff0c;那作为dba数据库服务的其重要性、必要性就突显而出。这里拿虚拟机试验做个配置记录&#xff0c;便于大家学习参考。 # 如出现服务器重启后登入报错无…

Unity组件开发--升降梯

我开发的升降梯由三个部分组成&#xff0c;反正适用于我的需求了&#xff0c;其他人想复用到自己的项目的话&#xff0c;不一定。写的也不是很好&#xff0c;感觉搞的有点复杂啦。完全可以在优化一下&#xff0c;项目赶工期&#xff0c;就先这样吧。能用就行&#xff0c;其他的…

【EI会议征稿通知】第三届智能电网与绿色能源国际学术会议(ICSGGE 2024)

第三届智能电网与绿色能源国际学术会议&#xff08;ICSGGE 2024&#xff09; 2024 3rd International Conference on Smart Grid and Green Energy 2024年第三届智能电网与绿色能源国际学术会议&#xff08;ICSGGE 2024&#xff09;将于2024年4月19-21日在中国成都举行。会议…

GraphQL和REST API的区别

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 GraphQL&#xff08;Graph Query Language&#xff09;和REST&#xff08;Representational State Transfer&#xff09;是两种用于构建和设计API的不同方法。以下…

基于ssm公交车信息管理系统论文

摘 要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于公交车信息的管理和控制&#xff0c;采用人工登记的方式保存相关数据&#xff0c;这种以人力为主的管理模式已然落后。…

vue2 element 弹出框拖拽会出现一层阴影问题

问题如图所示&#xff1a; 因增加 draggable 属性导致我弹窗表单清空文本框时&#xff0c;从右向左选中字体会出现拖拽阴影效果 去掉 draggable 即可 <template><div class"sys-jobTrigger-container"><el-dialog:visible.sync"state.isShowD…

上班经常迟到怎么办?

相信上班需要打卡的小伙伴都跟博主一样&#xff0c;经常可能因为迟一两分钟导致打开迟到而懊恼。 那么&#xff0c;如何避免这种问题呢&#xff1f;下面给大家提供一下博主自己试过的方法,效果还挺不错的 时间逆推法&#xff1a; 拿博主举例子&#xff0c;我住处到公司大概是…

react 基于Ant Desgin Upload简单实现导入 导出功能

效果图&#xff1a; 导入&#xff1a; 导出&#xff1a; 导入代码&#xff1a; const propsConfig {name: file,action: importDataExcelApi, //后端接口headers: {authorization: authorization-text,loginUserId: sessionStorage.getItem(userLogin)? JSON.parse(sessio…

C++完成使用map Update数据 二进制数据

1、在LXMysql.h和LXMysql.cpp分别定义和编写关于pin语句的代码 //获取更新数据的sql语句 where语句中用户要包含where 更新std::string GetUpdatesql(XDATA kv, std::string table, std::string where); std::string LXMysql::GetUpdatesql(XDATA kv, std::string table, std…

Spring——Spring基于注解的IOC配置

基于注解的IOC配置 学习基于注解的IOC配置&#xff0c;大家脑海里首先得有一个认知&#xff0c;即注解配置和xml配置要实现的功能都是一样的&#xff0c;都是要降低程序间的耦合。只是配置的形式不一样。 1.创建工程 1.1 pom.xml <?xml version"1.0" encoding…

基于SSM框架和Layui框架的管理系统

计算机毕业设计&#xff1a;打造安全、高效的信息管理系统在这个数字化时代&#xff0c;信息安全和高效管理是至关重要的。为了帮助学校或机构更好地管理和保护信息&#xff0c;我们为您设计了一套功能强大的信息管理系统。该系统利用先进的技术&#xff0c;结合MD5加密&#x…