java8实战 lambda表达式和函数式接口(上)

news2024/11/26 1:54:00

前言:

本博客对java8实战第三章的总结,也是上一篇博客行为化参数的延续,介绍一下函数式接口

Lambda表达式

 lambda的表达式的结构由:参数,箭头,主体构成。

lambda示例

函数式接口:

先看上一篇博文最后一个例子如下:,用lambda例子来筛选苹果,其中仓库inventory包含了很多苹果Apple对象list,然后再根据red条件筛选红色苹果,我们对筛选的这个行为进行行为参数化,其中Predicate<T> p,这个就是一个函数式接口。

public interface Predicate<T> {
    boolean test(T t);
}

public static <T> List<T> filter(<List<T> list, Predicate<T> p){
    List<T> result = new ArrayList<>();
    for(T e: list){
        if(p.test(e)){
            result.add(e);
        }        
    }
}


List<Apple> redAndHeavyApple = 
    filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));

什么是函数式接口?简单来说,就是定义一个抽象方法的接口,如上面Predicate接口里面定义了一个抽象方法test,它就是函数式接口,就是这么简单。

那么函数式接口可以用来做什么?Lambda表示式允许你直接以内联形形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例。简单来说,Lambda就是一个函数式接口的具体实现,而lambda主体部分就是函数式接口的抽象方法。

它的效果类似这样,以“等号”分割线的上下两部分一样的效果,而可以看到lambda表达式更简洁。

List<Apple> redAndHeavyApple = 
    filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));
===============================================
public class AppleRedPredicate implements Predicate {
    public boolean test(Apple apple) {
        return "red".equals(apple.getColor();
    }
}

List<Apple> redAndHeavyApple = 
    filterApples(inventory, new AppleRedAndHeavyPredicate());

Java API也有其他的函数式接口:

public interface Comparator<T> {
    int compare(T o1, To2);
}

public interface Runnable {
    void run();
}


public interface ActionListener extends EventListener{
    void actionPerformed(ActionEvent e);
}

public interface Callable<V>{
    V call();
}

public interface PrivilegedAction<V>{
    T run();
}

当前前面那个Predicate<T>接口也是.

如何使用lambda和函数式接口

书本举了一个"环绕执行模式"例子,环绕执行模式,在我看来就是,所有行为都是围绕执行处理过程,比如资源处理时候,打开一个资源(数据库或者文件),然后做一些处理,然后关闭操作,这过程中,中间这段处理过程就是重点。

如下,有一段代码式打开某个文件,并且读取一行并返回

public static String processFile() throws IOException{
    try (BufferdReader br = new BufferdReader(new FileReader("data.txt"))){
        return br.readLine();
    }
}

这段代码式有局限的,就如第一篇博客所说,需求式不断变化的,如果需求改为读取两行,或者返回使用最频繁的词,那上面代码无法满足,那么一种就是不断创建新函数,每种函数处理不同情况,还有一种保持一个处理函数,但是处理函数的入参是行为参数,处理函数统一处理不同行为参数,也就是说处理的行为,体现在参数上,如使用lambda表达式来体现行为参数:

String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());

那么对应的,processFile入参就是函数式接口,所以还需要创建一个能匹配BufferReader->String的函数式接口:

@FunctionalInterface
public interface BufferedReaderProcessor {
    String process(BufferedReader b) throws IOException;
}

然后processFile就变成了

public static String processFile(BufferedReaderProcessor p) throws IOException{
    try (BufferdReader br = new BufferdReader(new FileReader("data.txt"))){
        return p.process(br);
    }
}

因此我们就得到一个很灵活的processFile,通过用lambda表达式来表达不同的行为:

读取一行:

String result = processFile((BufferedReader br) -> br.readLine());

读取两行: 

String result = processFile((BufferedReader br) -> br.readLine() + br.readLine());

第三章剩下的部分下一篇博客继续讲。我个人感觉这种方式很灵活,我认为它也不是完全完美,其一就是要求行为参数代码量得少,个人感觉不适宜lambda写太多行为代码,我认为如果行为太过复杂反而用不同类来实现函数式接口,将入参变为不同类对象,反而代码可读性更好些。

参考文献:

 《java8 实战》

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

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

相关文章

Ubuntu-报错

Hadoop-Eclipse-java&#xff1a;耽误进度的几个报错 错误1&#xff1a;桥接模式与NAT模式相互切换后导致两种模式都不能访问互联网&#xff08;1&#xff09;具体错误&#xff1a;&#xff08;2&#xff09;错误原因&#xff1a;&#xff08;3&#xff09;解决方案&#xff1a…

Java_Arrays类

一、Arrays类 接下来学习的类叫做Arrays&#xff0c;其实Arrays并不是重点&#xff0c;但是我们通过Arrays这个类的学习有助于我们理解下一个知识点Lambda的学习。所以我们这里先学习Arrays&#xff0c;再通过Arrays来学习Lamdba这样学习会更丝滑一些_. 1.1 Arrays基本使用 …

【Linux】初识命令行

为什么使用命令行&#xff1f; 大多数的计算机用户只是熟悉图形用户界面(GUI)&#xff0c;采用图形方式显示的用户操作界面。命令行界面(CLI)是一种通过文本输入来与计算机进行交互的方式&#xff0c;用来和计算机进行交流沟通的非常有效的方式&#xff0c;正像人类社会使用文…

jetpack compose 学习(2)

jetpack compose 学习(1) 学会了如何创建一个compose项目,并成功run了起来 今天学习run起来的界面配置 找启动界面,当然是先找到界面的配置文件: androidManifest.xml 这个文件,然后通过启动项找到主界面, 第二步 按住ctrl 鼠标指向MainActivity 即可跳转主界面 进入后的界面…

HarmonyOS--基础组件Button

Button组件 可以包含单个子组件。 Button(label?: ResourceStr, options?: { type?: ButtonType, stateEffect?: boolean }) 1&#xff1a;文字按钮 Button(‘点击’) 2&#xff1a;自定义按钮,嵌套其它组件 Button() {Image(https://) }.type(ButtonType.Circle)

优质全套Spring全套教程

hello&#xff0c;我是小索奇&#xff0c;这里把Spring全套笔记分享出来哈&#xff0c;便于大家查看~一起加油 Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;Spring | Home Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各…

为什么要使用表单?

目录 1.与服务器端的数据交互 2. 表单验证 3. 无需JavaScript支持 4. 语义化 表单元素的局限性 1. 样式限制 2. 客户端验证的局限性 总结: HTML使用表单是为了在Web页面中收集和提交用户输入的数据。表单可以包含多个表单元素&#xff0c;如文本框、下拉列表、单选框和…

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

一、介绍 今天我们来聊一聊关于LLM的微调训练&#xff0c;LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型&#xff0c;但它具备理解和生成人类语言的能力&#xff0c;非常厉害&#xff01;它可以革新各个行业&#xff0c;包括自然语言处理、机器翻译、…

【ZYNQ学习】PL第一课

这节课讲什么&#xff1f; 这节课的名字本来是想写为LED&#xff0c;但这一课里除了LED也有按键&#xff0c;又想换为GPIO控制&#xff0c;但关于PL的GPIO控制&#xff0c;不应该这么草率和简单&#xff0c;而且这一课有很多和ZYNQ或者PL关联性不强的东西要说。 所以我写了删删…

mmpose 使用笔记

目录 自己整理的可以跑通的代码&#xff1a; 图片demo&#xff1a; 检测加关键点 自己整理的可以跑通的代码&#xff1a; 最强姿态模型 mmpose 使用实例-CSDN博客 图片demo&#xff1a; python demo/image_demo.py \tests/data/coco/000000000785.jpg \configs/body_2d_k…

探索人工智能中的AI作画:创意、技术与未来趋势

导言 AI作画是人工智能领域中一个备受关注的前沿应用&#xff0c;它将传统艺术与先进技术相结合&#xff0c;创造出令人惊艳的艺术品。本文将深入探讨AI作画的创意过程、技术原理以及未来可能的发展趋势。 1. AI作画的创意过程 艺术风格迁移&#xff1a; AI作画通过学…

es6学习(一):变量声明的方式对比:var,let,const

前言 在let和const出现之前,js可以使用var为变量命令,如果是函数也可以用function命名,甚至你可以直接不用任何关键字命名 var a 1function fn() { }b 2console.log(a)console.log(fn)console.log(b) 结果如下 var的特性 1.window环境下,var在最外层定义的变量会直接赋值给…

【UML】组件图中的供需接口与面向对象中的接口

UML&#xff08;统一建模语言&#xff09;组件图中的“供接口”&#xff08;Provided Interface&#xff09;和“需接口”&#xff08;Required Interface&#xff09;与面向对象编程中的接口概念有关联&#xff0c;但它们在应用上有所区别。 下面解释两者的关系&#xff1a; …

SIGGRAPH 2022 | 筷子该怎么用? ——基于贝叶斯优化和强化学习的灵巧手握筷及控制方法

使用仿生手灵巧地操作工具一直是计算机动画和机器人方向的一个长期具有挑战性的问题。工具使用的主要困难包括&#xff1a;手的高自由度&#xff1b;工具的欠驱动&#xff1b;以及手、工具和物体之间复杂的相互作用。操作的困难程度也取决于所涉及的工具类型。有些工具只需要牢…

【MATLAB源码-第100期】基于matlab的OFDM系统papr抑制算法对比,clipping,PTS,SLM。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM&#xff08;正交频分复用&#xff09;系统中&#xff0c;高峰均值功率比&#xff08;PAPR&#xff09;的抑制是一项关键技术&#xff0c;有助于提高信号的功率效率和传输质量。主要的PAPR抑制算法包括削波&#xff08;C…

2023 亚马逊云科技 re:lnvent 大会探秘: Amazon Connect 全渠道云联络中心

2023 亚马逊云科技 re:lnvent 大会探秘: Amazon Connect 全渠道云联络中心 前言一. Amazon Connect 介绍 &#x1f5fa;️二. Amazon Connect 使用教程 &#x1f5fa;️1.我们打开URl链接找到对应服务2.输入Amazon Connect选中第一个点击进入即可&#xff1b;3.在进入之后我们就…

实时抠像系统

实时抠像系统 先上效果图 实时抠像&#xff0c;不替换背景 实时抠像&#xff0c;并替换背景 随着直播用户的人数增加&#xff0c;实时抠像的市场需求也越来越多&#xff0c;为了满足市场需求&#xff0c;写了一个程序&#xff0c;可实现抠像&#xff0c;也可以实时换视频背景…

FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐我这里已有的以太网方案1G 千兆网 TCP-->服务器 方案10G 万兆网 TCP-->服务器客户端 方案常规性能支持多节点FPGA资源占用少数据吞吐率高低延时性能 4、TCP/IP 协议栈代码详解代码架构用户接口代码模块级细讲顶层模块PA…

DVWA靶场的设置

1).在win 10系统安phpstudy2016&#xff0c;如图所示 2&#xff09;创建DVWA的靶场&#xff0c;解压DVWA-master.zip到C:\phpStudy\WWW\DWA-master 3&#xff09;配置DVWA链接数据库 右键选择记事本打开configlconfig.inc.php.dist【也可以使⽤其他编辑⼯具打开】&#xff0c;…

实现树形结构的插件vue-tree-color及元素放大缩小拖动

实现流程图,借鉴vue-tree-color 引入依赖 npm install vue-tree-color 同时查看项目中是否已安装less和less-loader,因为该组件使用到less npm install --save-dev less less-loader 如果这里启动项目报错,有可能是less和less-loader的版本过高,可以降低版本,或者指定版本号…