java8新特性之lambda:lambda的结构和使用

Java8新特性 Stream允许我们以声明式的方式处理数据集合,可以将Stream看作是遍历数据集合的高级迭代器。Stream 与Lambda表达式结合使用,将使编码效率大大提高,可读性增强。Stream与IO中的是不同的概念操作案例:使用stream将集合中的手机按照序号num从小到大排序:Stream流的操作顺序Stream语法Lambda表达式是一个匿名函数,可以将Lambda表达式理解为一段可以传递的代码(将代码段数据一样传递)。使用Lambda表达式可以写出更简洁,更灵活的代码。 阅读详情

lambda的结构和使用

上回说到lambda之行为参数化了,里面也有使用lambda的一个小栗子,让我们见识到了lambda使代码变得是多么的美丽易读。今天,小隐就来整理一下lambda的结构和使用方式。

lambda的结构

lambda的结构有两种:
(parameters) -> expression
(parameters) -> { statements; }

parameters:参数,多个以逗号隔开。
expression :语句,即一句话或者一个操作。
statements :陈述,一个或多个语句。

这种语法在C#和Scala等语言中的类似功能广受欢迎。情况就不多做介绍了,注意花括号即可。不过作为一个刚换驾坐的人来说,更加推荐第二种方式,当然当你的代码足够简单明了的时候,第一种也确实更加赏心悦目一点。

知道了结构,那么能在哪里用呢?lambda只能在函数式接口中使用。

lambda的使用条件

lambda只能在函数式接口中使用,而函数式接口概括起来就是只有一个抽象方法的接口。这里为什么要强调抽象,因为现在java的接口中,方法不仅仅只有抽象方法了。因为某些原因就目前java的发展来看,接口越发的被安排去代替抽象类了。更从侧面展示了多重继承的影子(其实java早就想这么干了)。
在上一篇的行为参数化文中,我们帮红姐找手机时使用到了lambda,当时说看似传递的是行为,其实传递的是对象。原因就是传递的是函数式接口。而lambda只有在接收函数式接口的地方才可使用。以此来解决一个疑惑,这里的代码写了一个lambda那么这个lambda是代替什么的呢?代替的就是方法参数中的函数式接口。通过java的类型推断机制也就能确定这里的lambda是代替的哪个函数式接口了。
其实就我目前的认知来说,在自己的项目中定义函数式接口的地方极其少,甚至说都没有,这也是我后续需要探索的地方。当我发现某些情况使用自定义的函数式接口是非常不错的解决办法的时候,我也会回来补充到这里。目前作为整理的内容其实在我项目中是并未使用的,仅做为学习。
这里还是加上一个代码例子吧要不然感觉整理的内容有些空洞晦涩难懂。
依旧是上一篇中提到的帮美女红姐筛选手机的方法。我们定义一个函数式接口,然后在一个方法中把函数式接口作为参数,最后在调用这个方法的时候用lambda作为函数式接口的实现类去使用。下列内容是在同一个java类中的代码。

/**
* 定义要使用的类,这里为了方便使用嵌套类
*/
   private static class Phone {
       private String brand;
       private Integer price;
       private Boolean canUse;
       public String getBrand() { return brand; }
       public void setBrand(String brand) { this.brand = brand; }
       public Integer getPrice() { return price; }
       public void setPrice(Integer price) { this.price = price; }
       public Boolean getCanUse() { return canUse;}
       public void setCanUse(Boolean canUse) { this.canUse = canUse; }
   }
/**
* 定义函数式接口,这里的注解是1.8新加的,用来显式的声明这是一个函数式接口,同时编译器会对这个函数式接口进行检查,当不符合函数式接口的标准时不能编译通过。但是没有加此注解的接口如果满足函数式接口的定义依旧会被当做函数式接口。
*/
@FunctionalInterface
private interface Predicate<T>{
       Boolean test(T t);
   }
/**
* 定义把函数式接口作为参数的方法
*/
public static <T> List<T> screenPhone(List<T> list,Predicate<T> predicate) throws Exception{
       if( list==null || list.size()==0 || predicate == null){
           throw new Exception("参数不全");
       }
       List<T> resultList = new ArrayList<>();
       for (T item:list) {
           if(predicate.test(item)){
               resultList.add(item);
           }
       }
       return resultList;
   }
/**
* 在test1测试方法中调用方法
*/
public void test1() throws Exception{
       //参数
       List<Phone> list = new ArrayList<>();
       //返回值
       List<Phone> phones = new ArrayList<>();
       //筛选价格小于一千的苹果手机
       phones = screenPhone(list,phone -> {return "apple".equals(phone.getBrand())&&1000>phone.getPrice();});
   }

有时候lambda表达式只是调用了一个已经声明过的方法,为了增加可读性和进一步简化,可以使用方法引用。方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。
方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷
写法。它的基本思想是,如果一个Lambda代表的只是“直接调用这个方法”,那最好还是用名称
来调用它,而不是去描述如何调用它。

/**
* 筛选可用的手机
*/
public void test1() throws Exception{
        //参数
        List<Phone> list = new ArrayList<>();
        //返回值
        List<Phone> phones = new ArrayList<>();
        //使用方法引用
        phones = screenPhone(list,Phone::getCanUse);
        //使用lambda
        //phones = screenPhone(list,phone->phone.getCanUse());
    }

小隐小故事——函数式接口

近来南下诸国越来越躁动不安,作为对东南军区司令员的小隐目前正在召集部下开会。北方下发命令,要开始提防南下诸国的动作,安排好应对方针,做好必要时刻采取使用武力的准备。“你们觉得应该如何?”小隐环视一周。“小小水贼,司令且看我三日平了这盆国!”赛甘宁说到。隐司令看向了智囊团。赛孔明眉头紧锁,说:“这南下这盆国和我们隔海相望,这个事情理应让赛甘宁去,不过怕这些贼人龟缩内陆,赛甘宁的水军是在水上作战厉害,不过这上了陆地作战,赛武圣应该处理起来更得心应手啊。”
“不论你们水上还是陆地,我斯奈克的支援永远不会少了的!”空军大将斯奈克也说出了自己的想法。赛孔明突然明目一闪。“我们陆地作战有赛武圣,水上作战有赛甘宁,我们空中作战有斯奈克。不过有一些战斗情况瞬息万变需要能有一支部队应对这种变化的战斗情况,适应海陆空三种作战形态,方可处理这等棘手的问题啊!”“恩”隐司令点头道:“现在我正式成立函数式接口军,下设特种作战中队战狼中队,进行全方位训练,应对各种战场突发情况,随时提供能解决特殊战况问题的部队!”环视一周后,目标定格在一个人头上。“我现在正式任命拉姆达为东南军区函数式接口军特种作战中队战狼中队队长,代号冷锋!”
在这里插入图片描述
哈哈,真特么能吹!骚话说到这。我希望lambda也能成为个位看官编程武器中的特种武器来使用。而函数式接口就是指定义了一个抽象方法的接口,用来应对各种突发战况。当你调用的时候只需要通过lambda传递不同的作战计划即可。同时国家(java的类库)中很多地方也定义了很多方法来使用你的特种部队(函数式接口)尤其是新加的集合类库中使用居多。小隐也会在接下来整理java8中关于stream的知识和lambda与stream的结合使用。

java8 lambda表达式递归查询树形结构 @Override public List<DeviceGroupVo> getDeviceGroup() { //查询全部 List<DeviceGroupVo> deviceGroup = deviceGroupDao.getDeviceGroup(); List<DeviceGroupVo> collect = deviceGroup.stream() .filter(item. 阅读详情

相关推荐

链路聚合Eth-trunk以及华为交换机配置实例

链路聚合简介 以太网链路聚合Eth-Trunk简称链路聚合,它通过将多条以太网物理链路捆绑在一起成为一条逻辑链路,从而实现增加链路带宽的目的。同时,这些捆绑在一起的链路通过相互间的动态备份,可以有效地提高链路的可靠性。 目的: 随着网络规模不断扩大,用户对骨干链路的带宽和可靠性提出越来越高的要求。在传统技术中,常用更换高速率的接口板或更换支持高速率接口板的设备的方式来增加带宽,但这种方案需要付出高额的费用,而且不够灵活。 采用链路聚合技术可以在不进行硬件升级的条件下,通过将多个物理接口捆绑为一个逻辑接口

ChaseAug的博客 2万+

Java 8 lambda 方法/构造函数引用

方法引用让你可以重复使用现有的方法定义,并像Lambda一样传递它们。在一些情况下, 比起使用Lambda表达式,它们似乎更易读,感觉也更自然。 先前: inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())); 之后(使用方法引用和java.util.Comparator.comparing): inventory.sort(comparing(Apple::g.

java大神起床啦 4万+

Lumerical官方案例、FDTD时域有限差分法仿真学习(三)——环形谐振器(Ring resonator)之第二&第三部分

二、使用 MODE 的参数提取和蒙特卡罗 三、最终参数提取

weixin_45719141的博客 1万+

JAVA之Lambda表达式详解

文章目录一、基本概念1.背景2.Lambda表达式的语法3.函数式接口二、Lambda表达式的基本使用1.无返回值函数式接口2.有返回值函数接口3.语法精简三、变量捕获1.匿名内部类2.Lambda的变量捕获四、Lambda在集合当中的使用1.List和forEach、sort2.HashMap和forEach总结 一、基本概念 1.背景 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和

冰河的博客 2万+

nnU-Net v2实战:从零开始配置环境与训练自定义医学影像数据集

本文详细介绍了nnU-Net v2在医学影像分割中的实战应用,从环境配置到自定义数据集训练的全流程。重点讲解了Python 3.9+环境搭建、PyTorch安装技巧、医学影像数据预处理规范,以及五折交叉验证训练方法,帮助开发者快速掌握这一先进的医学影像分析工具。

weixin_28718487的博客 352

C++调用海康相机SDK采集图像(C++\QT Creator\openCV\线程\接口)

C++调用海康相机SDK采集图像(C++\QT Creator\openCV\线程\接口) 之前写了一篇关于C++调用海康相机SDK采集图像的文章,有很多人私下发送消息咨询了一些问题,由于工作繁忙,只答复了一部分问题,今天抽出时间从头梳理了一下大家提出的问题,把我能够回答的问题都解答一次。上一次的程序只是简单的实现了图像的采集,没有使用到线程,今天把程序重新做出调整,把线程和多态加进去。文章最后有项目的下载地址。 我使用的是QT Creator这个IDE,版本信息如下: 我把相机采集的图像转换为openC

大樱桃的博客 1万+

【Java基础】Java Lambda表达式详解

java8 中引入的 Lambda 表达式真的是个好东西,掌握之后,写代码更简洁了,一起来看看 Lambada 表达式常见的写法,加深理解。

yubao0723的专栏 1万+

从报错到定位:Memtest86 DQ位算法解析与实践指南

本文深入解析了Memtest86内存测试工具报错信息的解读方法,重点介绍了通过地址解析、数据转换、位比对和DQ定位四步算法,精准锁定故障DQ位的实践流程。文章以DDR4和DDR5为例,详细拆解了从十六进制报错到二进制比对的完整步骤,并提供了从单个报错分析到故障模式诊断的进阶指南,帮助用户将抽象的报错信息转化为具体的维修或排查依据。

sre5engineer的博客 486

Java中Lambda表达式使用及详解

Java中Lambda表达式使用及详解 前言 一、Lambda表达式的简介 Lambda表达式(闭包):java8的新特性,lambda运行将函数作为一个方法的参数,也就是函数作为参数传递到方法中。使用lambda表达式可以让代码更加简洁。 Lambda表达式的使用场景:用以简化接口实现。 关于接⼝实现,可以有很多种⽅式来实现。例如:设计接⼝的实现类、使⽤匿名内部类。 但是lamb

qq_45263520的博客 7万+

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 347

华为od 面试八股文_前端_02_含答案

华为od 面试八股文_前端_02_含答案

MISAYAONE的博客 1998

Java中的Lambda

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

qq_25775675的博客 4679

【保姆级教程】YOLOv8_OBB旋转目标检测:训练自己的数据集

【保姆级教程】YOLOv8_OBB旋转目标检测:训练自己的数据集

m0_51579041的博客 1万+

Java JDK8-17新特性 知识点总结Note

Java版本迭代 Java8 - Java17Oracle JDK和Open JDK 许可证不一样JEP(JDK Enhancement Proposals):jdk 改进提案,每当需要有新的设想时候,JEP可以提出非正式的规范(specification),被正式认可的JEP正式写进JDK的发展路线图并分配版本号。LTS(Long-term Support)即长期支持。

weixin_54372875的博客 2906

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java学习笔记16——java8的其他新特性

这是JDK9的新特性1.命令行中通过指令jshell,调取jshell工具2.常用指令:/help:获取关使用 jshell 工具的信息/help intro : jshell 工具的简介/list :列出当前 session 里所有有效的代码片段/vars :查看当前 session 下所有创建过的变量/methods :查看当前 session 下所有创建过的方法/imports :列出导入的包/history :键入的内容的历史记录。

qq_58956810的博客 891

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java8新特性——Lambda表达式

什么是Lambda表达式? Lambda表达式,也可称为闭包,java8的重要新特性之一。 Lambda表达式允许在方法的参数列表中将方法作为参数。 Lambda表达式长什么样? Lambda表达式有什么用? Lambda表达式可以使代码变得更加简单紧凑。 在集合遍历和其他集合操作中可以极大的优化代码结构。 Lambda表达式取代了过去的哪些东西? 为什么要改用Lambda表达式? Lambda表达式怎么用? ...

D_ps19990501的博客 217

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JAVA8新特性

Java8

weixin_39917908的博客 533

Java8新特性Lambda表达式的一些常见用法

一、Lamda简单介绍 Lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”。 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。 要理解函数式编程的产生目的,就要先理解匿名内部类。 先来简单看下匿名内部类调用方式。 interface Animal { void run(); } public class Main {

river106的博客 824

JDK8-17新特性

JDK8-17新特性

weixin_44525733的博客 1373

java8新特性 1-5

1. 尚硅谷_Java8新特性_简介 主要内容 Java新特性简介 其中最核心的为Lambda 表达式和Stream API 速度更快的原因: 比如一些底层的数据结构的变动,最典型的为hashmap Jdk1.7 采用的是数组+链表的方式 1 首先通过hash算法(hashcode方法)得到数组的索引,数组中存的是key,然后通过equal方法比较是否是相同的元素,如果是则修改该key对应的值,如果key不同,则将其加入到链表中,将前一个存在数组中的元素撞出去。 要知道,如果链表中存储的数据量过大后,

qq_17079255的博客 767

Java 8 Lambda 表达式使用说明与案例

Lambda 表达式是 Java 8 最重要的新特性之一,它使代码更加简洁,并支持函数式编程风格。

lanwp5302的博客 997

idea编译出现Error:(5, 22) java: -source 1.5 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)

在学习Java8一些特性的时候,出现了Lambda expressions are not supported at language level 1.5。并且编译后出现Error:(5, 22) java: -source 1.5 中不支持 lambda 表达式   (请使用 -source 8 或更高版本以启用 lambda 表达式)。刚开始按照网上的一些步骤均失败,后来发现是project

热爱技术、喜欢学习、乐于分享 2919

JDK 8 新特性

Java 8 (又称为 JDK 1.8) 是 Java 语言开发的一个主要版本。Java 8 是 Oracle 公司于 2014 年 3 月发布,可以看成是自 Java 5 以来最具革命性的版本。Java 8 为 Java 语言、编译器、类库、开发工具与 JVM 带来了大量新特性。速度更快代码更少(增加了新的语法 Lambda 表达式)强大的 Stream API优化 Fork/Join 框架,更加容易写并行代码最大化减少空指针异常 Optional时间 API。

CoderChronicle的博客 2653

Java中Lambda表达式的基本格式及使用

Java中Lambda表达式的基本格式及使用 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更简洁的 Java 代码,极大地优化代码结构。 Lambda 表达式可以对某些接口进行简单的实现,Lambda 规定接口中只能有一个必须被重写的抽象方法的接口,即函数式接口,使用注释**@FunctionalInterface**即可强制检测该接口是否为函数式接口。 格式:() -> {} ():匹配要重写的抽象方法的参数列表 ->:lambda符号,具有上下文推导的作用

lbw1998的博客 849

java8 新特性Lambda表达式(1)

1、Lambda简介 java8新特性,说白了就是一个匿名函数。如下代码,定义一个接口LambdaInterface,接口中是一个返回值为int的add方法。按照正常的流程应该是定义一个MyLambdaInterface 类实现这个接口,然后添加这个接口的实例,调用add方法。使用匿名内部类的话写法如下。使用Lambda表达式代码如下,比较可以看出更加Lambda表达式简洁,不过对于没有基础的朋友...

qq_38670578的博客 190

Java 8 之 Lambda表达式入门

Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变,Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中),或者把代码看成数据:函数式程序员对这一概念非常熟悉。在JVM平台上的很多语言(Groovy,Scala,……)从一开始就有Lambda,但是Java程序员不得不使用毫无新意的匿名类来代替lambda。 什么是Lambda表达式 ...

Soinice的博客 375
上一篇: java8新特性详解之lambda:行为参数化
下一篇: 使用java8异常整理
隐者诡道
博客等级 码龄11年 13粉丝 23原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值