Java8:Lambda简单实战

java 8实战 java 8实战第一部分 基础知识第一章 为什么要关心Java8第二章 通过行为参数化传递代码第三章 Lambda表达式第二部分 函数式数据处理第四章 引入流第5章 使用流 第一部分 基础知识 第一章 为什么要关心Java8 1.1.2 流处理 1.1.3用行为参数化把代码传递给方法 1.1.4并行与共享的可变数据(几乎免费的并行) 1.1.5Java需要演变 1.2.1方法和Lambda作为一等公民 方法引用::语法 Lambda——匿名函数 第二章 通过行为参数化传递代码 本章内容 应对不断变化的需 阅读详情

Lambda表达式可以理解为一种匿名函数:它没有名称,但是由参数列表,函数主体,返回类型,当然可能还有一个可以抛出的异常的列表。

Lambda的基本语法是

(parameters) -> expression

或(请注意语句的花括号)

(parameters) -> { statements; }
根据上述语法规则,以下哪个不是有效的Lambda表达式?
(1) () -> {}
(2) () -> "Raoul"
(3) () -> {return "Mario";}
(4) (Integer i) -> return "Alan" + i;
(5) (String s) -> {"IronMan";}

答案:只有4和5是无效的Lambda。
(1) 这个Lambda没有参数,并返回void。它类似于主体为空的方法:public void run() {}。
(2) 这个Lambda没有参数,并返回String作为表达式。
(3) 这个Lambda没有参数,并返回String(利用显式返回语句)。
(4) return是一个控制流语句。要使此Lambda有效,需要使花括号,如下所示:
(Integer i) -> {return "Alan" + i;}。
(5)“Iron Man”是一个表达式,不是一个语句。要使此Lambda有效,你可以去除花括号
和分号,如下所示:(String s) -> "Iron Man"。或者如果你喜欢,可以使用显式返回语
句,如下所示:(String s)->{return "IronMan";}。

这里我们从一个排序问题入手——用不同的排序策略来给一个Apple列表排序,我们从一个原始粗暴的解决方法一步步简明清晰化。

这里会用到一系列概念:行为参数化,匿名类,Lambda表达式和方法引用。

下面是Apple类的定义:

    public static class Apple {
        private Integer weight = 0;
        private String color = "";

        public Apple(Integer weight, String color) {
            this.weight = weight;
            this.color = color;
        }

        public Integer getWeight() {
            return weight;
        }

        public void setWeight(Integer weight) {
            this.weight = weight;
        }

        public String getColor() {
            return color;
        }

        public void setColor(String color) {
            this.color = color;
        }

        public String toString() {
            return "Apple{" + "color='" + color + '\'' + ", weight=" + weight + '}';
        }
    }

第一步:传递代码

Java 8的API已经为我们提供了一个List可用的sort方法,我们不用自己去实现它。

那么最困难的部分已经搞定了!但是,如何把排序策略传递给sort方法呢?
sort方法的签名是这样的:

void sort(Comparator<? super E> c)

它需要一个Comparator对象来比较两个Apple!这就是在Java中传递策略的方式:它们必须包裹在一个对象里。我们说sort的行为被参数化了:传递给它的排序策略不同,其行为也会不同。

List<Apple> inventory = new ArrayList<>();
public static class AppleComparator implements Comparator<Apple> {
        public int compare(Apple a1, Apple a2) {
            return a1.getWeight().compareTo(a2.getWeight());
        }
    }
inventory.sort(new AppleComparator());

第二步:使用匿名内部类

第一步的方案可以使用匿名内部类来进行优化,因为一个AppleComparator 比较器可能就使用一次,我们不需要单独创建一个类来实现它。

        inventory.sort(new Comparator<Apple>() {
            public int compare(Apple a1, Apple a2) {
                return a1.getWeight().compareTo(a2.getWeight());
            }
        });

第三步:使用Lambda表达式

使用匿名内部类的缺点:
1.它往往很笨重,占用了很多代码空间,换句话来说,它太啰嗦了。
2.用起来让人费解,逻辑不是很清晰。
Java 8中引入了Lambda表达式,它提供了一种轻量级的语法来实现相同的目标:传递代码。(放在我们这个问题里就是传递策略,List#sort()方法根据不同的策略(代码)来实现不同的排序)。
在这个例子中,Comparator代表了函数描述符(T, T) -> int。因为我们比较的是苹果,所以它具体代表的就是(Apple, Apple) -> int。

inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()));

因为,Java编译器可以根据Lambda出现的上下文来推断出Lamdba表达式参数的类型,那么我们的解决方案可以改写为:

inventory.sort((a1, a2) -> a1.getWeight().compareTo(a2.getWeight()));

到这里我们依旧不满足,Comparator具有一个叫作comparing的静态辅助方法,它可以接受一个Function来提取Comparable键值,并生成一个Comparator对象。

    public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
            Function<? super T, ? extends U> keyExtractor)
    {
        Objects.requireNonNull(keyExtractor);
        return (Comparator<T> & Serializable)
            (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
    }

它可以像下面这样用(注意你现在传递的Lambda只有一个参数:Lambda说明了如何从苹果中提取需要比较的键值):

Comparator<Apple> c = Comparator.comparing((Apple a) -> a.getWeight());
inventory.sort(c);

这里我们还可以把代码改的紧凑一些:

// 静态导包
import static java.util.Comparator.comparing;
inventory.sort(comparing((a) -> a.getWeight()));

第四步:使用方法引用

方法引用就是替代那些转发参数的Lambda表达式的语法糖。你可以用方法引用让你的代码更简洁(假设你静态导入了java.util.Comparator.comparing):

inventory.sort(comparing(Apple::getWeight));

方法引用让你重复使用现有的方法实现并直接传递它们。

恭喜你,这就是你的最终解决方案!这比Java 8之前的代码好在哪儿呢?

它比较短;它的意思也很明显,并且代码读起来和问题描述差不多:“对库存进行排序,比较苹果的重量。”

Java 8 List排序:Lambda与Comparator API实战指南 在Java编程中,集合排序是数据处理的基础操作,其核心在于比较逻辑的实现。传统方式通过Comparable接口或匿名内部类实现Comparator,代码较为繁琐。Java 8引入的Lambda表达式和函数式编程思想,使得行为参数化变得简洁高效。Comparator接口作为函数式接口,配合Lambda可以直观传递比较逻辑,显著提升代码可读性和编写效率。其技术价值在于通过声明式API(如comparing、thenComparing)支持多级排序、空值处理和反转排序,满足了复杂业务场景下的灵活排序需求。这些特性 阅读详情

相关推荐

【open judge】【程设】魔兽世界三开战!

#程设 魔兽世界三---开战!--------原以为会很容易ac,没想到写了好久,看来自己的水平还是亟待提高啊!有几个比较有趣的点:1. typeid(#include&lt;typeinfo&gt;)还是比较好用的,特别是本题当战士为wolf,iceman, dragon, ninja时有特殊技能,那么用typeid判断一下就很方便了。2. 对于这种输出很复杂的问题,往往通过使用文件的输入输出再...

weixin_40841416的博客 6073

Java8合并两个Map中元素的正确姿势

英文原文地址:https://www.baeldung.com/java-merge-maps 1. 介绍 本入门教程将介绍Java8中如何合并两个map。 更具体说来,我们将研究不同的合并方案,包括Map含有重复元素的情况。 2. 初始化 我们定义两个map实例 private static Map<String, Employee> map1 = new Has...

悟鸣的技术博客 6万+

从仿真到实物:Realsense D435+ROS2焊接机械臂的视觉标定与数据验证指南

本文详细介绍了如何将Realsense D435相机与ROS2焊接机械臂从仿真环境迁移到实物部署的全过程。通过视觉标定、数据验证和焊接场景优化,确保系统在真实环境中精准可靠。重点讲解了硬件配置、驱动优化、数据一致性验证及焊接应用的特殊处理,为工业自动化开发者提供实用指南。

weixin_28701593的博客 407

Java8编程实战

Java一直作为优秀的编程语言活跃于软件开发行业,掌握Java不仅是一件兴奋的事,更是一把可以帮助你轻松进入软件行业大门的一把金钥匙,本套课程将为读者讲解Java8的所有核心技术知识,一共240集的Java8开发课程,全网独一无二的教学视频资料,你还等什么?赶紧来学吧!官方QQ群:612148723。

【音视频处理】MP4、FLV、HLS适用范围,在线视频播放哪个更好

本期我们讨论在线点播的视频格式,对比这些视频格式的优劣以及原因 1、封装格式的作用 2、MP4 3、FLV 4、HLS

池鱼 - YiiGaa 2万+

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

Java 8新特性之--Lambda表达式详细讲解

换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖。如果我们开发中需要定义一个函数式接口,首先看看在已有的jdk提供的函数式接口是否提供了能满足需求的函数式接口。当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或无参数)时:ClassName::methodName(针对于3)如果给函数式接口提供实例,恰好满足方法引用的使用情境,就可以考虑使用方法引用给函数式接口提供实例。

业精于勤,荒于嬉 2171

通过Robotstudio修改机器人程序的具体方法和步骤

通过Robotstudio修改机器人程序的具体方法和步骤

Robot_PLC_HMI_Automation 6393

Java8新特性实战

Java为什么会一直在改变,因为编程语言就像生态系统一样,更优秀语言的出现,落后的语言就会被取代,除非它们不断地演变和进步。Java 8 引入的核心新特性包括:Lambda表达式、函数式接口、Stream流API、方法引用/构造器引用等。

G_12_M的博客 564

linux v3h平台开发系列详解(GMSL摄像头篇):1.11 解串器MIPI 1.5G高速率特殊deskew配置

解串器max96712 deskew配置

xian18809311584的博客 1775

APP签名验证全栈破解:Frida Hook绕过+算法逆向+Python一键调用(附可运行脚本)

做过APP逆向和爬虫的同学,肯定都被签名验证折磨过:改了一行代码重新打包,APP直接闪退;抓包看到接口有个sign参数,翻遍JS找不到加密逻辑;好不容易找到加密函数,一调用就崩溃。客户端APK签名校验服务端接口签名验证。前者防止你篡改APP,后者防止你伪造请求。很多人卡在第一步,改完APK就闪退,根本没机会碰接口。本文基于真实项目实战,分享一套通用的签名验证破解方案。从客户端APK签名校验的Frida Hook绕过,到服务端sign算法的逆向还原,最后用Python实现一键调用。

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

Java 8 Lambda实战:从语法到函数式编程革命

你是否还在为Java中冗长的匿名内部类而烦恼?是否厌倦了编写大量模板代码来实现简单的功能?Java 8的Lambda表达式(λ表达式)为我们带来了一场代码简洁性的革命。本文将通过"Java 8 Lambdas"项目的实战练习,带你从零开始掌握Lambda表达式,彻底改变你的编程方式。 读完本文后,你将能够: - 熟练编写各种形式的Lambda表达式 - 掌握Stream API进行数据处理 - ...

gitblog_00030的博客 359

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Java 8核心特性深度解析:Lambda、Stream与Optional实战指南

函数式编程作为一种编程范式,通过将计算视为数学函数的求值,并避免状态和可变数据,提升了代码的声明性和模块化。其核心原理在于将函数作为一等公民,支持高阶函数和纯函数,从而减少副作用。这一范式在现代软件开发中具有重要技术价值,它能显著提升代码的可读性、可维护性,并更好地支持并发编程。在实际应用场景中,函数式编程思想被广泛应用于集合数据处理、异步编程和空值安全处理。本文聚焦于Java 8如何通过引入Lambda表达式和Stream API等特性,将函数式编程理念融入Java生态,并深入探讨了Optional类在解

weixin_32267731的博客 323

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

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java 8 到 Java 21:Lambda、Stream 与新特性实战指南

本文系统梳理了Java 8至Java 21的核心演进,聚焦函数式编程、高并发与高性能特性。从Java 8的Lambda表达式、Stream API和Optional,到Java 9-11的模块化系统和语法改进,再到Java 14-17的Record类型和模式匹配,最后到Java 21的虚拟线程。通过代码示例与最佳实践,为开发者提供了一份现代Java开发指南,涵盖Lambda、Stream、Optional、模块化、Record、模式匹配和虚拟线程等关键特性,帮助开发者掌握Java的现代化转型路径。

刘一说的IT专栏 1217

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java8实战读书笔记:复合Lambda表达式

本文详细介绍复合lambda表达式的使用,主要包含比较器复合、谓词复合、函数复合这三种常用用法。

中间件兴趣圈 1693

《Java8实战》读书笔记01:Lambda 和 函数式接口

Java8学习笔记 - 在哪里可以使用Lambda表达式 + 什么是函数式接口定义举例 定义 你可以在函数式接口上使用Lambda表达式。 函数式接口就是只定义了一个抽象方法的接口。 举例 定义一个函数式接口 public interface NameFormat{ String format(String str); } 定义一个方法,它可以接收函数式接口类型的参数 public void showName(String name, NameFormat f){

灵台方寸山斜月三星洞 733

Java 8 新特性实战:Lambda、Stream 让代码简洁一倍

本文系统介绍Java 8核心新特性Lambda表达式与Stream API的实战应用,深入剖析它们如何让代码量平均减少80%以上。通过创建线程、集合排序、分组统计等典型场景对比,展现函数式编程从“命令式”到“声明式”的思维转变。并行流自动利用多核性能、方法引用进一步简化语法,为开发者写出简洁优雅的现代Java代码提供完整指南。

macowl的博客 1092

java8实战:Lambda 表达式

Java 8 Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。 lambda表达式是一段可以传递的代码,它的核心思想是将面向对象中的传递数据变成传递行为。 语法 lambda 表达式的语法格式如下:

凌霄的专栏 779

JAVA基础-Java8新特性解析:Lambda与Stream实战

Java 8(代号:Spider)是一次重大的版本更新,引入了多项革命性特性,旨在简化代码、提高开发效率并拥抱函数式编程思想。其核心特性包括Lambda表达式、Stream API、函数式接口、Optional类以及新的日期时间API等。下面将对这些新特性进行解构,并通过代码示例进行详细说明。一、核心新特性概览与对比RunnableComparatorPredicateFunction二、特性详解与代码示例1. Lambda表达式Lambda表达式本质上是函数式接口的一个实例。

qq_42961719的博客 838

java8实战二:Lambda 表达式

Lambda 表达式前片文章讲到,使用匿名类来表示不同的行为并不令人满意:代码十分啰嗦,这会影响程序 员在实践中使用行为参数化的积极性。在本章中,我们会教给你Java 8中解决这个问题的新工 具——Lambda表达式。它可以让你很简洁地表示一个行为或传递代码。现在你可以把Lambda 表达式看作匿名功能,它基本上就是没有声明名称的方法,但和匿名类一样,

只有变秃 才能变强 843

《Java8实战》读书笔记07:Lambda 重构、测试和调试(设计模式实现)

注意:我们重构的目的是让代码更简洁直观,这也是我们要不要把换成的依据。(如果重构后,导致逻辑更绕,阅读成本增加就没必要了。) 可用来简化的废话代码。(比如:核心代码就一句话,为了这一句,以前非得让我实例化一个匿名类再重写方法,太多无用功。) Lambda 是,是。对此保持清醒的认识,关于、的问题就不言自明了。 的根据上下文决定。如果出现,可以类型。例子: (IntelliJ支持这种重构,能自动帮你检查) 8.1.3 从 Lambda 表达式到方法引用的转换 这是一段实现的分组逻辑。将内的业务代码

灵台方寸山斜月三星洞 813

Java 8 代码重构实战之一:用 Lambda、方法引用与 Stream API 打造现代代码

Java 8 的函数式特性彻底改变了代码的书写方式。通过。

技术交流,一起进步 462

《Java8实战》读书笔记03:Lambda 表达式的组合用法

《Java8实战》 - 读书笔记 - Lambda 表达式的组合用法3.8 复合 Lambda 表达式的有用方法1. 比较器复合测试对象比较器 Comparator.comparin按照 age 升序按照 age 降序比较器链 thenComparing使用 `thenComparing` 拼接`排序条件`使用 `thenComparing` 拼接`比较器`2. 谓词复合 Predicate<T>逻辑非 negate逻辑与 and逻辑或 or3. 函数复合 Function<T/,V>先己后人 andTh

灵台方寸山斜月三星洞 967

Java 8新特性:Lambda表达式与Stream API实战

after) {

微风不留尘 1182
上一篇: Java8:Lamdba表达式与局部变量
下一篇: Java8:复合Lambda 表达式
SunTree_X
博客等级 码龄10年 0粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值