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

news2024/11/28 22:34:56

一、简要描述

  • 使用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);
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode编辑器下载与安装

1、下载 官网下载地址&#xff1a; 打开下载地址&#xff0c;如下图&#xff0c;根据自己的平台选择相应版本下载&#xff08;本文只针对Windows系统的安装&#xff0c;所以下载Windows版的&#xff09;。 点击会自动下载&#xff0c;下载完成文件如下图&#xff1a; 2、安装…

超实用的小红书达人投放策略分析,纯干货

为什么我投放了小红书达人却没有什么效果&#xff1f; 品牌到底应该怎么投放小红书达人&#xff1f; 品牌小红书达人投放怎么去把控和规划&#xff1f; 小红书达人作为品牌方和用户之间的桥梁&#xff0c;直接影响消费决策。达人粉丝数量大&#xff0c;粘性高&#xff0c;很…

市场复盘总结 20240104

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: 方法一:指标选股 select * from dbo.ResultAll where 入选类型 like %指标选股% and 入选日期=20240104;方法二:趋势选股法 1、最低价持续3日上涨 2、均价…

CSS transition详解

文章目录 属性transition-propertytransition-durationtransition-timing-functiontransition-delaytransition 简写属性 方法Element&#xff1a;transitionrun 事件Element&#xff1a;transitionstart 事件Element&#xff1a;transitionend 事件Element&#xff1a;transit…

深入探究:使用大型AI模型的实战指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在今天的技术领域&#xff0c;大型AI模型已成为…

指增的超额来自于哪里,2024的乾坤九法,美股的宏观估值双杀

图片截止到&#xff1a;2024/1/4 上证 周四 -0.43% 市场热点分析 1. 2024元旦后国内外市场都出现了不同程度的下跌。技术面国内市场一直走在72日均线之下&#xff0c;而且没有形成底部&#xff0c;熊市还会延续。宏观方面&#xff0c;12月官方PMI持续向下&#xff0c;小企业更多…

C++_string类

目录 一、string的模拟实现 1、初始化字符串 2、拷贝构造 3、赋值重载 4、迭代器 5、比较字符串 6、尾插字符、字符串 7、resize 8、中间插入数据、删除数据 8.1 插入数据 8.2 删除数据 9、查找数据 10、打印对象&#xff08;流插入、流提取&#xff09; 结语&a…

【企业动态】Silicon Labs中国区总经理拜访东胜物联,加深合作交流

12月27日&#xff0c;芯科科技(Silicon Labs)中国区总经理周巍先生前来我司拜访&#xff0c;东胜物联CEO支江峰先生热情接待&#xff0c;双方就物联网网关、Beacon等产品合作相关事宜进行交流。 在这次重要的会晤中&#xff0c;双方就技术创新以及未来合作方向进行了深入沟通。…

快手推荐算法工程师三面回顾

快手三次技术面试一次HR面试的简单回顾&#xff0c;希望对大家有所启发。 一面 面试官一上来就让写算法题&#xff0c;第一个是计算岛屿数量&#xff0c;第二个是最长回文字串。 然后就是介绍自己的论文。对于论文的工作&#xff0c;面试官只是在问关于论文的问题&#xff0…

光掩膜基板,到2024年全球市场规模将超过30亿美元

光掩膜基板是一种用于微电子加工的关键材料&#xff0c;其特点是具有高透光性和高平整度&#xff0c;能够提升微电子元器件的成品率和品质。全球市场分析 从全球市场来看&#xff0c;光掩膜基板市场规模持续增长。据分析&#xff0c;到2024年&#xff0c;全球光掩膜基板市场规模…

buuctf-Misc 题目解答分解106-108

106.[DDCTF2018]流量分析 提示了私钥 &#xff0c;无厘头&#xff0c;先不管了&#xff0c;应该是流量加密了&#xff0c;用wireshark 打开 看看&#xff0c;真个数据流量&#xff0c;没有http 直接找到TCP 协议的包追踪一下TCP 找到TCP 不是红色的包追踪&#xff0c;大量的数…

webStorm打开终端Cannot open Local Terminal Failed to start [powershell.exe] in

今天webStorm打开终端显示 Cannot open Local Terminal Failed to start [powershell.exe] in D:\allproject\boosterStation 有关详细信息&#xff0c;请查看 IDE 日志(帮助 | 在 Explorer 中显示日志)。 解决方案&#xff1a; 打开设置&#xff08;如下图&#xff09;&a…

Mysql和Redis数据一致性问题

MySQL和Redis数据一致性算是个很经典的问题,在之前也看到过很多相关的文章,最近心血来潮,想把一致性问题的解决方案和存在问题都总结一下。 不推荐方案 1 先更新MySQL,再更新Redis。 如上图有两个请求要同时进行更新操作,在并发情况下,B请求虽然更新时间晚于A请求,但是…

【docker】如何编写dockerfile文件,构建docker镜像

如何编写dockerfile文件&#xff0c;构建docker镜像 一、docker 镜像与 dockerfile1.1 什么是Docker镜像1.2 Docker 镜像的结构 二、dockerfile 中常用的构建指令三、dockerfile 内容示例四、构建 docker 镜像 一、docker 镜像与 dockerfile 1.1 什么是Docker镜像 Docker镜像…

robots.txt

####什么是robots.txt? ​ robots.txt是一个协议,我们可以把它理解为一个网站的"管家",它会告诉搜索引擎哪些页面可以访问,哪些页面不能访问。也可以规定哪些搜索引擎可以访问我们的网站而哪些搜索引擎不能爬取我们网站的信息等等,是网站管理者指定的"君子协议…

互联网分布式应用之RabbitMQ

RabbitMQ Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. RabbitMQ介绍安装 2. Rabbi…

C# 使用正则表达式

正则表达式概念 称规则表达式&#xff08;Regular Expression&#xff0c;通常缩写为 Regex&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为"元字符"&#xf…

【unity】基于Obi的绳长动态修改(ObiRopeCursor)

文章目录 一、在运行时改变绳子长度:ObiRopeCursor1.1 Cursor Mu&#xff08;光标μ&#xff09;1.2 Source Mu&#xff08;源μ&#xff09;1.3 Direction&#xff08;方向&#xff09; 一、在运行时改变绳子长度:ObiRopeCursor Obi提供了一个非常通用的组件来在运行时修改绳…

RK3568 学习笔记 : ubuntu 20.04 下 Linux-SDK 镜像烧写

前言 开发板&#xff1a;【正点原子】ATK-DLRK3568 开发板&#xff0c;编译完 Linux-SDK 后&#xff0c;生成了相关的镜像文件&#xff0c;本篇记录一下 镜像烧写&#xff0c;当前编译环境在 VMware 虚拟机中&#xff0c;虚拟机系统是 ubuntu 20.04 此次烧写还算顺利&#xff…

10 个最佳 Python GUI 框架

图形用户界面&#xff08;通常称为 GUI&#xff09;是用户打开应用程序或网站时遇到的交互环境。 今天给大家分享 10 个最佳 Python GUI 框架 1. PyQt5 PyQt5 由 Riverbank Computing 开发&#xff0c;是一款备受青睐的用于图形用户界面&#xff08;GUI&#xff09;的 Pytho…