Java8-Lambda表达式(函数式编程)

《Java从小白到大牛》第18章:Java 8函数式编程基础——Lambda表达式 第18章 Java 8函数式编程基础——Lambda表达式 Java 8之后推出的Lambda表达式开启了Java语言支持函数式编程[1](Functional Programming)新时代。Lambda表达式,也称为闭包(Closure),现在很多语言都支持Lambda表达式,如C++、C#、Swift、Objective-C和JavaScript等。为什么Lambda表达式这怎么受欢迎,这是因为Lambda表达式是实现支持函数式编程技术基础。 [1]函数式编程是种编程范式,它将计算机电脑运算视为函数的 阅读详情

引言

课本上说编程有两种模式,面向过程的编程以及面向对象的编程,其实在面向对象编程之前还出现了面向函数的编程(函数式编程),以前一直被忽略、不被重视,现在从学术界已经走向了商业界,对函数编程语言的支持目前有Scala、Erlang、F#、Python、Php、Java、Javascript等,有人说他将会是编程语言中的下一个主流…

函数式接口

函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法), 因此最开始也就做SAM类型的接口(Single Abstract Method)。

JDK中已有的一些接口本身就是函数式接口,如Runnable。 JDK 8中又增加了java.util.function包, 提供了常用的函数式接口。

函数式接口代表的一种契约, 一种对某个特定函数类型的契约。 在它出现的地方,实际期望一个符合契约要求的函数。 Lambda表达式不能脱离上下文而存在,它必须要有一个明确的目标类型,而这个目标类型就是某个函数式接口。

Java8教程:

Java8教程可以查看到其他java8的新特性

使用

举例:

常规用法

1,无参数

    interface IWay0{
        void gotoSchool();
    }

    IWay0 way0 = () ->{
        System.out.println("way0:来到学校了");
    };
    way0.gotoSchool();

2,一个或多个参数

        interface IWay1{
            void gotoSchool(String name);
        }

        interface IWay2{
            void gotoSchool(String name, String tool);
        }

        //含有参数
        IWay1 way1 = (name) ->{
            System.out.println("way1:" + name + "来到学校了");
        };
        way1.gotoSchool("小明");
        IWay2 way2 = (name, tool) ->{
            System.out.println("way2:" + name + tool + "来到学校了");
        };
        way2.gotoSchool("小明","踩单车");

安卓中具体使用:

原始用法:
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             Log.i(e, "click");
            }
        });
Lambda表达式:        
        mBtn.setOnClickListener((v) ->{
            Log.i(e, "click");
        });

::的用法

1,静态方法调用

当函数方法只调用单个静态方法时,可以使用

    interface IWay0{
        void gotoSchool();
    }

    interface IWay1{
        void gotoSchool(String name);
    }

    interface IWay2{
        void gotoSchool(String name, String tool);
    }

    interface IWay3{
        void gotoSchool(String name, String tool, int time);
    }


    static class Clocker{
        public static void clock(){
            System.out.println("放学了,同学们回家吧");
        }

        public static void clock(String name){
            System.out.println("放学了" + name + "回家");
        }

        public static void clock(String name, String tool){
            System.out.println("放学了" + name + tool + "回家");
        }
        public static void clock(String name, String tool, int time){
            System.out.println(time + "点钟放学了" + name + tool + "回家");
        }
    }

            //只调用单个静态方法
        IWay0 way00 = Clocker::clock;
        way00.gotoSchool();

        IWay1 way11 = Clocker::clock;
        way11.gotoSchool("小红");

        IWay2 way22 = Clocker::clock;
        way22.gotoSchool("小红", "走路");

        IWay3 way33 = Clocker::clock;
        way33.gotoSchool("小红", "走路", 5);

输出:

放学了,同学们回家吧
放学了小红回家
放学了小红走路回家
5点钟放学了小红走路回家
2,复用方法引用

其实就是函数方法的引用的复用,比如已经实例化了一个a变量,需要复用a变量中的m方法,只需要b = a::m,b.m()即可,前提a对应的class是函数式接口

        //没有参数
        IWay0 way0 = () ->{System.out.println("way0:来到学校了");};
        way0.gotoSchool();

        //含有参数
        IWay1 way1 = (name) ->{System.out.println("way1:" + name + "来到学校了");};
        way1.gotoSchool("小明");

        //等同于IWay0 way01 = () ->{System.out.println("way0:来到学校了");};
        IWay0 way01 = way0::gotoSchool;
        way01.gotoSchool();

        //等同于IWay1 way1 = (name) ->{System.out.println("way1:" + name + "来到学校了");};
        IWay1 way02 = way1::gotoSchool;
        way02.gotoSchool("小刚");

输出

way0:来到学校了
way1:小明来到学校了
way0:来到学校了
way1:小明来到学校了
3, 调用构造方法

Class::new,得到的是一个函数式接口

    static class Way0{
        private String mTool = "骑单车";
        public Way0(){}

        public Way0(String tool){
            mTool = tool;
        }

        @Override
        public void gotoSchool() {
            System.out.println("我要" + mTool + "去上学了");
        }
    }

    //需要借助函数式接口
    @FunctionalInterface
    interface WayInterface1{
        Way0 create();
    }

    @FunctionalInterface
    interface WayInterface2{
        Way0 create(String name);
    }

    WayInterface1 wayInterface = Way0::new;
    Way0 iway1 = wayInterface.create();
    iway1.gotoSchool();

    WayInterface2 wayInterface2 = Way0::new;
    Way0 iway2 = wayInterface2.create("走路");
    iway2.gotoSchool();

输出

我要骑单车去上学了
我要走路去上学了
测试 Wi-Fi、蓝牙性能 前几天去原厂测试了 Wi-Fi 和蓝牙的性能,现在把了解到的知识总结一下 RF通路新理解 RF通路一般分为两部分:芯片端、天线端 芯片端 芯片端包括芯片+芯片出来的RF匹配电路,是来调芯片的阻抗匹配的。 天线端 天线前一般也会有一段天线匹配电路,是留给天线调天线的阻抗匹配的。 调试的时候是两部分分开调试的,下面调试的就是芯片端。 测试“阻抗匹配”用网络分析仪看史密斯圆图 测试... 阅读详情

相关推荐

Ansys Lumerical + HFSS + optiSLang 三剑客:手把手教你优化行波MZM调制器(附完整参数配置)

本文详细介绍了如何利用Ansys Lumerical、HFSS和optiSLang三款工具构建自动化协同设计流程,以优化行波马赫曾德尔调制器(TW-MZM)的性能。通过参数化仿真、流程集成与元模型技术,该方案能高效解决多物理场耦合挑战,实现调制带宽、驱动电压等多目标的全局优化,显著提升光子集成芯片的设计效率与性能潜力。

weixin_29251131的博客 585

java8新特性(Lambda表达式,函数式接口)

java8新特性1.Lambda表达式2.函数式接口一级目录一级目录一级目录 1.Lambda表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以 传递的代码(将代码像数据一样进行传递)。 2.函数式接口 一级目录 一级目录 一级目录 ...

weixin_45345128的博客 853

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

2024年7月1日接到安全部门同事邮件通知,目前生产环境及测试环境服务器Openssh存在远程代码执行漏洞(CVE-2024-6387),漏洞等级高,且攻击者可以成功利用该漏洞获得远程root shell最高权限从而执行任意代码及命令,主要受影响版本为8.5p1

菜鸟运维升级之路 2万+

Java中的Lambda

大家应该都知道面向对象的特性(抽象、封装、继承、多态)。其实在 出现之前,我们关注的往往是某一类对象应该具有什么样的属性,当然这也是面向对象的核心–对数据进行抽象。但是出现以后,这一点开始出现变化,在某种场景下,更加关注某一类共有的行为(这与之前的接口有些类似),这也就是提出函数式编程的目的。面向对象编程到面向行为编程的变化我们知道,对于一个变量,我们可以赋给其一个**“值”**。如果你想把**“一块代码”**赋给一个变量,应该怎么做呢?比如,我想把右边那块代码,赋给一个叫做的变量:在之前,这个是做不到的

qq_25775675的博客 4679

Unity游戏开发实战:用柏林噪声打造3D随机地形(附完整C#代码)

本文详细介绍了如何在Unity游戏开发中使用柏林噪声算法生成3D随机地形,包含完整的C#代码实现。从基础柏林噪声原理到高级参数控制,再到性能优化和常见问题解决,帮助开发者掌握程序化地形生成技术,打造丰富多变的游戏世界。

weixin_29281941的博客 99

二维“能量源”(电场、磁场、功率)入射边界设置方法

comsol光学仿真设计相关学习笔记和经验 1. 二维“能量源”(电场、磁场、功率)入射边界设置方法 2.边界条件设置薄膜材料

VJCP_90909Bu0的博客 5192

《JAVA EE》内部类(下篇)&Lambda表达式的注意事项

接下来将详细介绍匿名内部类以及Lambda表达式的用法和注意事项。Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。优点代码简洁,开发迅速方便函数式编程非常容易进行并行计算Java引入Lambda,改善了集合操作缺点代码可读性变差在非并行计算中,很多计算未必有传统的for性能要高不容易进行调试!!.........

VIBE的博客 1981

基于simulink的车道保持辅助系统(LKA)的仿真与实现

本文介绍了如何利用Simulink实现车道保持辅助系统(LKA)的仿真与建模。首先对比了车道偏离预警(LDW)和LKA的功能差异,强调LKA的主动干预特性。接着详细阐述了LKA系统架构,包括环境感知、决策控制等核心组件,并基于自行车模型建立车辆横向动力学方程。 文章重点演示了Simulink建模步骤:搭建车辆动力学模型、设计LKA控制器(采用LQR算法)、实现执行器接口和驾驶员干预检测。通过四个典型场景的仿真测试,验证了系统在直道行驶、弯道跟踪等工况下的控制性能,并给出了关键评价指标。最后展望了MPC控制、

amy_mhd的博客 227

2021-04-12——新特性Lambda表达式和Function函数式接口编程

语言新特性Lambda表达式和Function函数式接口编程 前言:jdk1.8推出了lambda表达式和函数式接口编程, 1、lambda在JSR(Java Specification Requests) 首先,我们从JSR需求中可以看到,JSR335即为 Lambda Expressions for the JavaTMProgramming Langua 2、lambda在jsl(Java LanguageSpecifications) ...

蒙奇D灬小武的博客 1065

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

【YOLO11改进 - 注意力机制】SCSA通过结合空间注意力和通道注意力,提高各种下游视觉任务的性能。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 474

OpenClaw实战三|电商自动化AI工具:自动上下架+智能客服+订单统计,小店运营效率直接翻3倍

对电商小团队、夫妻店、个人商家来说,最缺的不是流量,而是省时间的工具。OpenClaw这套电商自动化AI工具,不用懂代码、不用买昂贵的SaaS软件,一台服务器、简单配置,就能把最耗时间的工作全部交给AI。人只做最有价值的事:选品、拍图、搞流量、处理复杂售后,剩下的上下架、回复、统计,全都让AI帮你打工。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1459

Lambda小课堂:巧用“Function”

在开发过程中经常会使用if...else...进行判断抛出异常、分支处理等操作。这些if...else...充斥在代码中严重影响了代码代码的美观,这时我们可以利用Java 8的Function接口来消灭if...else...

天明的博客 805

NX二次开发 计算多个体的最小包围盒

多个体的最小包围盒

weixin_72680115的博客 430

Java8 Lambda表达式 和 函数式编程 原理详解

前言 1、前言   Java8既JDK1.8。Lambda表达式是Java8的新特性,除此之外Java8还提供了其他新特性,比如:函数式编程、方法引用、Stream、Optional类、默认方法、新的日期类型、Base64、Nashorn, JavaScript 引擎。   本篇详细介绍Lambda表达式,其他的后续慢慢介绍。   它是一个语法糖,糖是甜的,但是对于初学者并不是,当你熟悉之后,你会发现,它是真的香。   Lambda表达式的初衷是,进一步简化匿名类的语法(不过实现上,Lambda表达

Curry4ever 2757

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java8函数式编程和lambda表达式

文章目录函数式编程JDK8接口新特性函数接口方法引用 函数式编程 函数式编程更多时候是一种编程的思维方式,是一种方法论。函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。简单说,函数式编程是基于某种语法或调用API去进行编程。 例如,从整型数组中找出最小的那个数字,采用命令式编程实现如下: public static void main(String...

FEEL的博客 3241

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

java 8函数式编程与Lambda表达式

这篇文章不是我原创的,见其简 单易懂,就拿过来了。原文详见http://www.infoq.com/cn/articles/Concise-Java?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk Java的设计目标包括面向对象、易于上手(在当时,这意味着使用C

cktmyh的专栏 1119

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java8新特性:Lambda表达式与函数式编程

Java8已经发布好久了,说是新特性其实早就不算新特性了,之前一直想补上这块内容,现在来讲讲我对Lambda表达式和函数式编程的理解。函数式编程在框架类代码中很常见,尤其是Spring源码中特别多,它的最主要作用就是简化代码,封装变化。后面我们在讲Spring源码时会再次讲到函数式编程。

欢迎来到Jimmy的博客 2436

从 Java 8 到 Java 24 的 Lambda 表达式与函数式编程演进

Java 8 是 Lambda 表达式在 Java 语言中的一个重要里程碑,为 Java 增加了函数式编程的能力。从 Java 8 引入 Lambda 表达式以来,函数式编程在 Java 生态系统中不断发展和完善。Java 8 奠定了函数式编程的基础,后续版本通过 Stream API 增强、局部变量类型推断、外部函数和内存 API 等特性,持续丰富函数式编程的能力。这些特性使 Java 开发者能够编写更加简洁、可读和可维护的代码,同时充分利用现代多核处理器的优势进行并行计算。

wb04307201的博客 1051

java8新特性——函数式编程(lambda表达式)

java是面向对象语言,但是有时候为了更加方面的实现某些功能,引入了函数式编程,本文通过详细解析,让读者快速上手函数式编程

caoyuan666的博客 2062

Java8新特性—Lambda表达式与函数式编程

版权声明:本文为神州灵云作者的原创文章,未经神州灵云允许不得转载。 本文作者:Rujion 在JDK8之前,我们常会使用匿名类来表示一些的代码块,从外部传递方法,但是十分繁琐。在JDK8中,出现了一个新的工具Lambda表达式,同时也引进了一种新的编程方式——函数式编程。 ##1.什么是函数式编程 在聊Lambda表达式之前,先聊聊函数式编程。 函数式编程是种编程方式,它将电脑运算视为函数的计...

dclingcloud的博客 503

java 1.8函数式编程_java8 -函数式编程之Lambda表达式

1 前言java 8已经流行很多年了,springboot 2、spring 5 等开源代码也已经开始使用大量函数式编程。为了跟上潮流和看懂一些源码,下面我们一起学习java8的函数式编程。由于在lambda的学习过程中,不免会用到函数式编程中的一些接口,我们先学习一些简单的函数式编程接口。2 函数式编程接口在 java 8 的java.util.function包中提供了一些最常用的函数式接口...

weixin_42318225的博客 222

函数式编程:Java 8 Lambda表达式

函数式编程语言操纵代码片段就像操作数据一样容易。虽然Java不是函数式语言,但Java 8 Lambda 表达式和方法引用(Method Reference)允许你以函数式编程。

凄戚的博客 782

Java8函数式编程之二 : Lambda表达式

针对上篇博客最后留下的问题,也就是java8怎样解决匿名内部类代码难看,臃肿的的问题

zlz18225318697的博客 421

Java 8的变革:函数式编程和Lambda表达式探索

本文探讨了这些特性如何为Java带来了显著的变革和优势。首先,我们深入探讨了函数式编程的概念及其在Java 8中的实现方式,比较了传统的面向对象编程与函数式编程风格的差异。接着,文章分析了Lambda表达式的引入,以及它们如何简化了代码结构、提升了代码的可读性和灵活性。进一步讨论了Lambda表达式在集合操作、并行处理以及事件驱动编程中的应用,展示了它们在各种场景下的实际用途。最后,总结Java 8通过引入函数式编程和Lambda表达式这两个关键特性,如何使得Java语言在现代编程范式中更具竞争力和适应性。

忆~遂愿的博客 8062

JAVA8学习总结——函数式编程与lambda表达式

概述  java8引入lambda表达式,提倡函数式编程。根据一些函数编程的定义指出,函数式编程是基于λ演算,而λ演算的一大特点就是以函数作为输入和输出。          至于以函数作为输入和输出,在javaScript中体现得更明显一些,如下: function function1(num1,num2){ var reulst = num1+num2; docu

qq_36372507的博客 560

java8系列01——函数式编程思想与Lambda表达式

目录1.1为什么要学函数式编程1.2 函数式编程思想2.Lambda表达式2.1 思想及原则2.2 示例2.3 省略规则 1.1为什么要学函数式编程 java8引入了函数式编程,在工作中应用得特别广泛,如果不学习可能会看不懂公司中同事的代码。 函数式编程对于海量数据的处理特别有帮助,提供了并行流,可以让程序员不用自己进行并发编程(这无疑是有难度的)。 代码可读性其实会更高,避免嵌套地狱,可以看看下面这个例子。 1.2 函数式编程思想 面向对象编程关注什么对象做什么事情,但是函数事编程把关注点转移到了数据

半旧518的博客 697
上一篇: 设计模式——享元模式
下一篇: ConstrainLayout初探
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值