java 函数接口Consumer简介与示例【函数式编程】【Stream】

Java 8 中的 消费者接口Consumer 是一个函数接口,它可以接受一个泛型 类型参数,它属于java.util.function包。我们来看看Java函数接口库中的定义:

@FunctionalInterface
public interface Consumer<T> {/*** Performs this operation on the given argument.** @param t the input argument*/void accept(T t); //抽象方法/***下面是一个默认方法***/default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}

accept(T) 方法:是 Consumer 函数式接口的惟一抽象方法,传入单个输入参数,无返回值,可以用于 Lambda 表达式和方法引用。
andThen(Consumer) 方法:是默认方法。上面是这个默认方法的源代码。它可以传入一个 Consumer ,返回组合了两个 Consumer 后的 Consumer ,传入的 Consumer 不能为 null,否则会得到 NullPointerException 。

你可以使用 Consumer 来执行某个动作,比如打印操作,该动作接受一个参数并且不返回任何值。

我们先来看两个例程:

import java.util.function.Consumer;
public class ConsumerTest {public static void test() {Consumer<String> first = x -> System.out.println("1."+x.toLowerCase());Consumer<String> second = y -> System.out.println("2." + y);System.out.println("开始");Consumer<String> consume = first.andThen(second);//调用了accept 时,会先执行 first 的代码,再执行 second 的代码consume.accept("World");}public static void main(String[] args) {test();}
}

consume调用accept 方法时,会先执行 first 里的代码,再执行 second 里的代码
测试结果:
在这里插入图片描述

第二个例程:

package function;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
public class ConsumerTest {//Consumer接口的匿名实现类版本public static void test1() {List<String> list = Arrays.asList("我","爱","北京天安门");list.forEach( new Consumer<String>() {@Overridepublic void accept(String string) {System.out.println(string);}}  );}public static void main(String[] args) {test1();}
}

这段程序很简单,首先初始化一个String类型的集合List,然后向控制台输出集合中每个元素。其中我们注意到forEach方法,它就是Java8中新增加的默认方法。

集合框架中的集合类都实现了迭代接口,forEach方法是Iterable接口的默认方法,被关键字default修饰。这样任何实现该接口的集合都继承forEach方法。Iterable接口的源码如下:

public interface Iterable<T> {..省略.default void forEach(Consumer<? super T> action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}
}

forEach方法的输入参数就是一个Consumer类型的参数action。本例中方法test1()是Java7以前版本的老式写法,传入的是一个Consumer接口的匿名实现类:

new Consumer<String>() {@Overridepublic void accept(String string) {System.out.println(string);}
}

在Java8以后版本,可以使用Lambda表达式,这个Consumer接口的匿名实现类可简写成:
string->System.out.println(string)
因此,方法test1()就可以改写为如下的Lambda表达式版本:

	//Lambda表达式版本public static void test1() {List<String> list = Arrays.asList("我","爱","北京天安门");list.forEach( string->System.out.println(string) );}

Lambda表达式:string->System.out.println(string)
还可改写为方法引用 : System.out::println
这二种写法是等效。
所以,我们还可以改写为如下的方法引用的版本:

	//方法引用的版本public static void test1() {List<String> list = Arrays.asList("我","爱","北京天安门");list.forEach( System.out::println );}

改写后版本的效果与前面的Consumer接口的匿名实现类版本完全等价。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;
public class ConsumerTest {public static void main(String[] args) {List<String> list = new ArrayList<>();Consumer <String> consumer  = x -> {if (x.startsWith("a")){list.add(x);}};Stream.of( "aa","bb","cac","abd","ee" ).forEach(consumer);list.forEach(System.out::println);}
}

测试结果:
在这里插入图片描述
未完待续

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

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

相关文章

vue+elmentui 定义狂拽黑金配色的按钮+消息框

1 修改效果 通过自定义样式的方式可以修改elmentui的配色&#xff0c;例如下面我们修改掉了button的primary配色为黑金色&#xff1a; 修改前&#xff1a; 修改后 修改了elementui 的$message(success类型&#xff09;颜色为黑金色、图标也修改为金色了&#xff1a; 修改前…

Windows 环境下 Go 语言使用第三方压缩包 gozstd 的报错处理

该文章主要记录在windows平台用go语言使用gozstd包时&#xff0c;遇到的错误及处理过程&#xff08;踩坑之旅&#xff09;&#xff01; 一、gozstd简介 gozstd是一个针对Zstandard&#xff08;简称Zstd&#xff09;的Go语言包装器&#xff0c;它提供了简单且高效的API&#xf…

Blazor开发框架Known-V2.0.8

V2.0.8 Known是基于Blazor的企业级快速开发框架&#xff0c;低代码&#xff0c;跨平台&#xff0c;开箱即用&#xff0c;一处代码&#xff0c;多处运行。目前已有部分客户在使用&#xff0c;最近客户的项目和产品&#xff0c;有的在Docker中运行&#xff0c;有的在重新升级改造…

使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API

实时监测环境数据是一个非常常见的应用场景&#xff0c;例如气象站、智能家居等。这篇博客将带你使用 ESP32 微控制器和一个 TFT 屏幕&#xff0c;实时显示当前城市的天气信息。通过 OpenWeatherMap API&#xff0c;我们能够获取诸如温度、天气情况以及经纬度等详细的天气数据&…

Python异常处理

Python的异常处理是编程中非常重要的一部分&#xff0c;它允许程序在运行时遇到错误时优雅地处理这些错误&#xff0c;而不是简单地崩溃。异常处理机制包括try、except、else、finally等关键字&#xff0c;它们共同工作以捕获和处理程序中可能出现的错误。 1.异常的基本概念 …

如何有效清理宝塔控制面板中的垃圾文件与优化系统性能

宝塔控制面板&#xff08;BT-Panel&#xff09;作为一款流行的服务器管理软件&#xff0c;极大地简化了Linux服务器的管理任务&#xff0c;包括网站部署、数据库管理、文件操作等。然而&#xff0c;随着服务器运行时间的增长&#xff0c;系统中会积累各种临时文件、日志文件、缓…

探索Python的工业通信之光:pymodbus的奇妙之旅

文章目录 探索Python的工业通信之光&#xff1a;pymodbus的奇妙之旅背景&#xff1a;为何选择pymodbus&#xff1f;pymodbus是什么&#xff1f;如何安装pymodbus&#xff1f;5个简单的库函数使用方法3个场景使用示例常见bug及解决方案总结 探索Python的工业通信之光&#xff1a…

Python WebSocket自动化测试:构建高效接口测试框架

为了更高效地进行WebSocket接口的自动化测试&#xff0c;我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架&#xff0c;并重点关注以下四个方面的内容&#xff1a;运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…

深入探索MyBatis的动态代理模式

文章目录 深入探索MyBatis的动态代理模式引言一、 MyBatis动态代理概述动态代理的优势 二、准备工作文件存放结构视图1、Mybatis的主配置文件 mybatis-config.xml2、db.properties文件:3、mybatis-config.xml引用properties文件: 三、MyBatis动态代理的实现原理1. Mapper接口定…

Linux·权限与工具-make

1. Makefile/makefile工具 首先展示一下&#xff0c;makefile工具如何使用。我们先写一个C语言程序 然后我们建立一个Makefile/makefile文件&#xff0c;m大小写均可。我们在文件中写入这样两行 wq保存退出后&#xff0c;我们使用 make 命令 可以看到生成了可执行程序&#xff…

人工智能在Facebook的角色:创新与挑战并存

人工智能&#xff08;AI&#xff09;已经成为推动科技进步的重要力量&#xff0c;而在社交媒体领域&#xff0c;Facebook则是将AI技术广泛应用的先锋。Facebook通过AI来改善用户体验、提高内容质量以及优化广告投放&#xff0c;极大地提升了平台的功能与价值。然而&#xff0c;…

渗透第三次作业

xss game前八关复现 第一关 传参进入h2标签 传入一个alert(1) 发现没有触发&#xff0c;原因是官方禁用了script 选择用img标签 ?somebody<img src1 οnerrοr"alert(1337)"> 第二关 先把它的双引号闭合掉&#xff0c;再执行1337再闭合 ?jeff111";al…

【Python零基础】while循环和用户输入

文章目录 前言一、input()函数二、while循环三、使用while循环来处理列表和字典总结 前言 我们开发一个应用程序&#xff0c;目的都是为了解决最终用户的问题&#xff0c;针对用户界面输入的数据&#xff0c;按照用户期待的逻辑进行处理&#xff0c;得到用户想要的结果。本章将…

Java | Leetcode Java题解之第347题前K个高频元素

题目&#xff1a; 题解&#xff1a; class Solution {public int[] topKFrequent(int[] nums, int k) {Map<Integer, Integer> occurrences new HashMap<Integer, Integer>();for (int num : nums) {occurrences.put(num, occurrences.getOrDefault(num, 0) 1);…

【机器学习】(基础篇六) —— 数据集的划分和过拟合问题

数据集的划分 训练集和测试集 在机器学习中&#xff0c;数据集通常会被划分为训练集&#xff08;Training Set&#xff09;和测试集&#xff08;Test Set&#xff09;&#xff0c;有时还会包括一个验证集&#xff08;Validation Set&#xff09;。这样的划分是为了能够更好地…

SQL 数据库设计、事务、视图 <13>

一、数据库设计 1.多表之间的关系 1&#xff09; 一对一&#xff08;了解&#xff09; 如&#xff1a;人和身份证 分析&#xff1a;一个人只有一个身份证&#xff0c;一个身份证只能对应一个人 2&#xff09;一对多&#xff08;多对一&#xff09; 如&#xff1a;部门和员…

Flink消费Kafka数据积压排查解决

0、背景 有个Flink任务每天不定时会出现数据积压&#xff0c;无论是白天还是数据量很少的夜里&#xff0c;且积压的数据量会越来越多&#xff0c;得不到缓解&#xff0c;只能每日在积压告警后重启&#xff0c;重启之后消费能力一点毛病没有&#xff0c;积压迅速缓解&#xff0…

立仪光谱共焦传感器行业应用|薄膜高度差扫描

01&#xff5c;检测需求&#xff1a;扫描薄膜圆圈的高度差 02&#xff5c;检测方式 客户要求扫描薄膜圆圈的高度差&#xff0c;根据观察样品我们选择立仪科技D40A30镜头搭配H系列控制器进行测量 03&#xff5c;光谱共焦测量结果 薄膜圆圈的高度差轮廓 04&#xff5c;光谱共焦…

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶 例程说明源码下载目录工程配置一、SDL2的初始化和退出二、OLED画点和读点三、更新OLDE的GRAM四、清屏和清某区域五、点阵字库六、显示字符串七、显示中文字符八、显示图片九、测试代码十、主函数十一、运行结果 例程说…

05 serv00安装typecho

下载 ‍ cd domain/xxx.serv00.net/# 下载typecho git clone https://github.com/typecho/typecho.git# 当前有两个目录 typecho/ 和 public_html/ ls# 替换html rm -rf public_html/ mv typecho public_html‍ 安装 浏览器访问你的网站 xxx.serv0.net&#xff0c;看见 type…