java中的函数式接口:(Consumer、BiConsumer、Supplier、Predicate、Function、BiFunction)

news/2024/7/7 20:29:19/文章来源:https://www.cnblogs.com/ahulwj/p/18278619
  1. Consumer

说明:(1)consumer接口来自java8中引入的Java.util.function包

   (2)Consumer是一个功能接口,用来作为lambda表达式或方法引用的任务目标(传递一个参数执行指定的方法)。

功能:Consumer的功能接口是一个接受单一参数并且不返回任何结果的操作。必要时,"结果"可以存在在集合里面,Consumer的功能方法是accept(T t)

  1. accept : 这是Consumer功能接口的功能方法。accept 方法对给定的参数进行这一操作。
  2. andThen : 此方法返回一个组合的Consumer,该Consumer先执行原始的Consumer操作,然后按照从左到右的顺序执行给定的andThen操作

代码示例:

 1 /*
 2 注意consumer接收一个参数,正常不返回数值
 3 /*
 4 //直接返回String的长度
 5 Consumer<String> print = data -> System.out.println(data.length());
 6 print.accept("abcdefg");
 7 System.out.println("-----------------");
 8 
 9 List<Integer> list = Arrays.asList(1, 2, 3, 4);
10 //集合的每个元素乘以5
11 Consumer<List<Integer>> multiflyFive=i->{
12     for (int j = 0; j < i.size(); j++) {
13         i.set(j,i.get(j)*5);
14     }
15 };
16 //打印每个元素
17 Consumer<List<Integer>> printList=i->{
18     for (int j = 0; j < i.size(); j++) {
19         System.out.print(i.get(j)+" ");
20     }
21 };
22 //每个先乘以5之后再打印
23 //5 10 15 20
24 multiflyFive.andThen(printList).accept(list);

返回结果:

7
-----------------
5 10 15 20

  2.BiConsumer

说明:(1)consumer接口来自java8中引入的Java.util.function包

   (2)BiConsumer是一个功能接口,用来作为lambda表达式或方法引用的任务目标(传递两个参数执行指定的方法)。

功能:BiConsumer的功能接口是一个接受两个参数并且不返回任何结果的操作。BiConsumer的功能方法是accept(T t, U u)。

  1. accept : 这是Consumer功能接口的功能方法。accept 方法对给定的参数进行这一操作。
  2. andThen : 此方法返回一个组合的BiConsumer,该BiConsumer先执行原始的BiConsumer操作,然后按照从左到右的顺序执行给定的andThen操作

代码示例:

 1 //拼接map中的key和value,以:间隔
 2 BiConsumer<String,Integer> print = (K, V) -> System.out.println(K+":"+V);
 3 print.accept("1",2);
 4 System.out.println("-----------------");
 5 
 6 Map<String,Integer> map = Maps.newLinkedHashMap();
 7 for (int i = 0; i < 3; i++) {
 8     map.put(i+"",i);
 9 }
10 
11 //打印key拼接a
12 BiConsumer<String,Integer> print1=(K,V)->{
13     System.out.println("原始数据--->"+K+":"+V);
14 };
15 
16 //打印value乘以2
17 BiConsumer<String,Integer> print2=(K,V)->{
18     System.out.println("数值翻倍--->"+K+":"+V*2);
19 };
20 //打印key拼接a后打印value乘以2
21 for (Map.Entry<String, Integer> entry : map.entrySet()) {
22     print1.andThen(print2).accept(entry.getKey(), entry.getValue());
23 }

 返回结果:

1:2
-----------------
原始数据--->0:0
数值翻倍--->0:0
原始数据--->1:1
数值翻倍--->1:2
原始数据--->2:2
数值翻倍--->2:4

  3.Supplier

说明:(1)Java Supplier接口来自Java 8中引入的 java.util.function包。

   (2)Supplier是一个功能接口,代表结果的提供者。

功能:Supplier的功能接口是不需要接受参数并且获取结果的操作。Supplier的功能方法是get()

代码示例:

//输出四个十以内的随机数
Supplier<Integer> supplier=()->new Random().nextInt(10);
List<Integer> list = Lists.newArrayList();
for (int i = 0; i < 4; i++) {list.add(supplier.get());
}
list.forEach(i-> System.out.println(i));

返回结果:

7
2
4
5

 

 4. Predicate

说明:(1)Predicate接口来自Java 8中引入的 java.util.function包。

   (2)Predicate是一个返回值布尔值的函数。

 

代码示例:

 1 import lombok.Data;
 2 import lombok.experimental.Accessors;
 3 import org.apache.commons.lang3.StringUtils;
 4 
 5 import java.util.function.Predicate;
 6 
 7 public class Test0807 {
 8 
 9     public static void main(String[] args) {
10         Stu stu1 = new Stu().setAge(20).setName("张三").setSex("男");
11 
12         //年龄是否大于20
13         Predicate<Stu> condition1=i->i.getAge()>20;
14         //是否性别是女
15         Predicate<Stu> condition2=i-> StringUtils.equals("女",i.getSex());
16 
17         //判断stu1的年龄是否大于20
18         boolean test1 = condition1.test(stu1);
19         System.out.println("test1 = " + test1);//false
20 
21         //negate对结果取反
22         boolean test11 = condition1.negate().test(stu1);
23         System.out.println("test11 = " + test11);//false
24 
25         //判断stu1是否性别是女
26         boolean test2 = condition2.test(stu1);
27         System.out.println("test2 = " + test2);//false
28 
29         //判断stu1是否同时年龄大于20与性别是女
30         stu1.setAge(25);
31         boolean test3 = condition1.and(condition2).test(stu1);
32         System.out.println("test3 = " + test3);//false
33 
34         //判断stu1是否年龄大于20或者性别是女
35         boolean test4 = condition1.or(condition2).test(stu1);
36         System.out.println("test4 = " + test4);//true
37 
38         //判断stu与stu1是否equals
39         Stu stu = new Stu().setSex("男").setAge(25).setName("张三");
40         boolean test5 = Predicate.isEqual(stu).test(stu1);
41         System.out.println("test5 = " + test5);//true
42     }
43 }
44 
45 @Data
46 @Accessors(chain = true)
47 class Stu{
48 
49     private String name;
50 
51     private Integer age;
52 
53     private String sex;
54 }

 5. Function

说明:(1)Function接口来自Java 8中引入的 java.util.function包。

   (2)Function是一个功能接口,用来作为lambda表达式或方法引用的任务目标(传递一个参数执行指定的方法)。

功能:Function的功能接口是一个接受单一参数并且返回单一结果的操作。

   Function的功能方法是R apply(T t);

Function具有以下方法:

代码示例:

 1 public class Test0807 {
 2 
 3     public static void main(String[] args) {
 4 
 5         Function<Integer,Integer> multi=i-> i*10;
 6         Integer result = multi.apply(10);
 7         System.out.println("result = " + result);
 8 
 9         Function<Integer,Integer> add=i -> i + 10;
10         //先加10再乘以10
11         result= multi.compose(add).apply(10);//(10+10)*10
12         System.out.println("result = " + result);
13         //先乘以10再加10
14         result= multi.andThen(add).apply(10);//10*20+10
15         System.out.println("result = " + result);
16     }
17 }

 

 

 5. BiFunction

说明:(1)BiFunction接口来自Java 8中引入的 java.util.function包。

   (2)BiFunction是一个功能接口,用来作为lambda表达式或方法引用的任务目标(传递两个个参数执行指定的方法)。

功能:BiFunction的功能接口是一个接受两个参数并且返回单一结果的操作。

   BiFunction的功能方法是R apply(T t, U u);

BiFunction具有以下方法:

  1. apply: 这是BiFunction功能接口的功能方法。apply方法对给定的参数进行这一操作。
  2. andThen : 此方法返回一个组合的BiFunction,该BiFunction先执行原始的BiFunctionr操作,然后按照从左到右的顺序执行给定的andThen操作

代码示例:

 1 import java.util.function.BiFunction;
 2 
 3 public class Test0807 {
 4 
 5     public static void main(String[] args) {
 6         //value*10
 7         BiFunction<String,Integer,Integer> biFunction1=(K,V)->{
 8             V=V*10;
 9             return V;
10         };
11         Integer a = biFunction1.apply("a", 10);
12         System.out.println("a = " + a);//10
13 
14         //value+10
15         Integer a1 = biFunction1.andThen(i -> i + 10).apply("a", 10);//10*10+10
16         System.out.println("a1 = " + a1);
17 
18 
19         //key大写
20         BiFunction<String,Integer,String> biFunction2=(K,V)->{
21             K=K.toUpperCase();
22             return K;
23         };
24         String a2 = biFunction2.apply("a", 10);
25         System.out.println("a2 = " + a2);//A
26 
27         //拼接本身
28         String a3 = biFunction2.andThen(i -> i.concat(i)).apply("a", 10);
29         System.out.println("a3 = " + a3);//AA
30 
31 
32     }
33 }

 

 

参考引用:https://blog.csdn.net/m0_46360888/article/details/132161245

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ros microros 舵机控制原理

1. 什么是舵机: 舵机是一种位置伺服的驱动器,主要是由外壳、电路板、驱动马达、齿轮组和位置反馈电位计等元件所构成,适用于那些需要角度不断变化并可以保持的控制系统。 2. 舵机的工作原理是:控制电路板接收来自信号线的控制信号,控制电机转动,电机带动一系列齿轮组,减…

STM32时钟配置

STM32F10x时钟配置 根据参考手册可知STM32F10x系列的时钟树如下:图中给了说明了HSE、HSI、LSI、LSE的全称。HSE(The high speed external clock signal),高速外部时钟信号,需要4-16MHz的外部振荡器 HSI(The high speed internal clock signal),高速内部时钟信号,使用8MHz…

SpringBoot项目配置文件加密

前言 防止配置文件敏感信息泄露,去年公司出现过类似事件,也防止源码泄露,对项目中的配置文件进行加密 引入方式 pom文件引入以下依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifac…

Educational Codeforces Round 167 (Rated for Div. 2) A-D

A. Catch the Coin题意:在一个二维坐标系上有一个硬币每秒y轴坐标减一,而你每秒可以向旁边八个方向移动,问你有没有一个时刻你会和硬币重叠。 思路:注意到在y小于-2时,我们无论如何都追不到硬币,而其他时候我们可以采取向左下或者右下的策略来保持和硬币y轴下落同步移动的…

ASP.NET Core MVC 从入门到精通之HttpContext

原文链接:https://www.cnblogs.com/hsiang/p/17368101.html 什么是HttpContext? 在B/S模式开发的程序中,客户端是浏览器,服务器端Web服务程序,HttpContext是连接客户端和服务器端程序的桥梁,交代了当前请求的环境信息,它封装了请求[Request]和响应[Response]及其他所有信…

实战篇——SQL注入sqli-labs-master靶场实战一

实战篇——SQL注入sqli-labs-master靶场实战(1) SQL注入的原理 没有对用户的输入进行合法性判断或过滤,而是直接将其拼接至SQL查询语句当中作为命令执行,从而导致非法操作。 SQL注入的检测 也就是闭合方式的判断,根据报错信息的不同情况可以分为3类——(1)有报错信息 (2)无报…

不用虚拟机在Windows上安装Linux子系统(win11)

打开终端输入以下命令查看是否支持安装systeminfo最底下是4个yes代表支持 在开始菜单输入如下搜索 打开拉到最底下,勾选这两个选项 按照提示重启电脑 打开终端输入以下命令会自动安装最新的Ubuntu发行版wsl --install可以通过如下命令查看其他版本wsl --list --online安装过程…

manim边学边做--Tex

Tex类继承自MathTex,具体功能和MathTex差不多,有一些细节的差别。在实际的使用中,我感觉Tex在结合一般文本和公式时更方便一些,所以我用的比较多的是Tex。Tex在manim各个模块中的位置大致如上图中所示。 1. Tex与MathTex区别 Tex的主要参数和方法和MathTex是一样的,所以本…

[开源分享]好用的在线客服系统 PHP客服系统源码 聊天源码(开源代码+终身使用+安装教程+全新UI)

源码介绍 PHP在线客服系统源码采用全新UI,重新设计前端界面,后台采用php+mysql,免费开源源码。在线客服系统已成为企业与客户之间沟通的重要渠道。通过在线客服系统,企业可以方便地与客户进行实时沟通和解决问题,提升客户满意度。php客服系統源码主要功能要求: 全新UI 自动…

不只是前端,后端、产品和测试也需要了解的浏览器知识

一、我们为什么要了解浏览器? 1. 对于前端开发者 1.浏览器是用户体验的第一线。我们需要了解浏览器的工作原理,才能有效地设计和实现用户界面,确保良好的用户体验。 2.好的产品需要考虑浏览器兼容性。我们需要了解这些差异,以确保网站或应用在不同的浏览器中都能正常工作,…

从人工到自动化到AIOps再到ChatOps:大模型在运维领域的应用

一、引言 在信息技术飞速发展的今天,运维工作已经从最初的人工操作,逐步演变为自动化、AIOps(人工智能运维)和ChatOps(通过聊天的方式去运维)。这些变革不仅提升了运维效率,还显著保障了系统的稳定性。特别是借助大模型,运维同学能够更加高效地完成工作,并应对复杂的运…

ros microros 使用超声波雷达测量距离

我们使用的超声波模块一共有四个引脚,分别是TRIG 即发送引脚,用于发送超声波ECHO 即接收引脚,用于接收反射回来的超声波VCC 电源接5VGND 电源地 一、新建工程新建example18_sr04二、编写代码带注释的代码如下#include <Arduino.h> #define Trig 27 // 设定SR04连接的A…

tensorflow-gpu配置

1.安装Anaconda 下载地址:Anaconda | The Operating System for AI 2.查询tensorflow-gpu不同版本所对应的python、cuDNN和CUDA的版本 官网:在 Windows 环境中从源代码构建 | TensorFlow (google.cn) 3.使用conda安装相应的库# tensorflow_gpu-2.3.0 conda init conda crea…

Charles 使用

一、下载安装官网:https://www.charlesproxy.com/二、移动端抓包 2.1、安装证书 设置代理弹出对应的 代理ip 和端口号,在移动端的wifi 配置对应的代理,然后返回对应的证书地址 下载证书 安装 即可

ubuntu与windows双系统时间不同步

两个系统时间不同步是因为对于硬件时间(BIOS里的时间)的时区认定不一致,windows认为BIOS的时间是当前系统时区(中国时区:UTC+08(CST-8)),ubuntu认为BISO时间是UTC时区时间.两个系统在启动是按照BISO时间设置系统时间导致了系统时间差异。 处理思路无非,修改windows或者ub…

图像采集卡是什么,有什么用处

机器视觉技术的发展源于光学、化学、物理、电子、电视、机械设计、数学、软件、人工智能、计算机和计算机视觉以及互联网等领域的发现。随着这些不同学科取得某些里程碑式的进展,它们为开发用于自动检查、测量、过程控制和机器人引导应用的成像系统铺平了道路。 图像采集卡是许…

如何把电子书转成EPUB?

大家知道EPUB是什么格式吗?其实EPUB是一种电子图书标准,由国际数字出版论坛提出。它是一个自由的开放标准,属于一种可以“自动重新排版”的内容;也就是文字内容可以根据阅读设备的特性,以较适于阅读的方式显示。有很多时候,不同的阅读器所支持的电子格式是不一样的,所以…

一文读懂“负载均衡”

原文链接:https://blog.csdn.net/cyl101816/article/details/135195729 负载均衡无处不在,无论是分布式,还是中间件,还是微服务,都需要涉及到负载均衡。 一、什么是负载均衡负载均衡是一种在计算机网络和系统架构中使用的技术,用于均衡分发工作负载到多个资源,比如:服务…

ros mocroros 使用双核运行microros

在硬件篇开始的第一节时,曾提到,我们所使用的开发板单片机是双核240M主频的,但是在后面的开发中我们并没有真正的使用了双核,主频也是使用的默认160MHZ。所以本节带你一起带你一起提升主频并启动双核进行MicoROS的双核。 一、双核与RTOS介绍 所谓双核指的是ESP32单片机有两…