当前位置: 首页 > news >正文

Lambda 表达式(也称为匿名函数)-在java,javascript,python

Lambda 表达式(也称为匿名函数或 lambda 函数)是一种简洁地表示可以在需要函数对象的地方使用的单表达式的方法。它们是在许多现代编程语言中引入的,包括 Python、Java、C# 和 JavaScript 等,用于编写更简洁、更易于阅读的代码。

Python 中的 Lambda 表达式

在 Python 中,Lambda 表达式非常常见,其基本语法如下:

lambda arguments: expression

这里,arguments 是传递给函数的参数(可以是多个,用逗号分隔),而 expression 是关于这些参数的单个表达式。Lambda 函数会产生该表达式的结果。注意,Lambda 函数本质上是一个表达式,它产生一个函数对象。

示例
  1. 简单的 Lambda 函数

    square = lambda x: x * x
    print(square(4))  # 输出: 16
    
  2. 使用 Lambda 函数作为参数

    def apply_to_list(func, lst):return [func(x) for x in lst]numbers = [1, 2, 3, 4, 5]
    squared = apply_to_list(lambda x: x*x, numbers)
    print(squared)  # 输出: [1, 4, 9, 16, 25]
    
  3. filter()map() 函数一起使用

    numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    filtered = filter(lambda x: x % 2 == 0, numbers)
    print(list(filtered))  # 输出偶数: [2, 4, 6, 8, 10]mapped = map(lambda x: x*x, numbers)
    print(list(mapped))  # 输出每个数的平方: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

JavaScript中的 Lambda 表达式

在JavaScript中,实际上并没有传统意义上的Lambda表达式,因为JavaScript的函数本身就是一等公民(first-class citizens),可以像变量一样被传递、赋值和作为参数传递。但是,我们可以将箭头函数(Arrow Functions)视为JavaScript中的Lambda表达式的等价物,因为它们提供了一种更简洁的方式来编写函数表达式。

箭头函数提供了一种更简洁的语法来编写函数,并且它们不绑定自己的thisargumentssupernew.target。这些函数表达式最适合用于非方法函数,并且它们不能用作构造函数。

以下是几个使用箭头函数(即JavaScript中的“Lambda表达式”)的例子:

示例 1:基本用法

const add = (a, b) => a + b;
console.log(add(2, 3)); // 输出: 5

示例 2:单个参数

如果箭头函数只有一个参数,可以省略括号:

const square = x => x * x;
console.log(square(4)); // 输出: 16

示例 3:没有参数

如果没有参数,则必须保留空括号:

const sayHello = () => 'Hello!';
console.log(sayHello()); // 输出: Hello!

示例 4:多行代码

虽然箭头函数通常用于单行表达式,但你也可以在它们的大括号内编写多行代码。但是,此时你需要使用return语句来返回值(如果函数体不是单个表达式):

const sum = (a, b) => {return a + b;
};
console.log(sum(2, 3)); // 输出: 5

示例 5:作为参数传递给高阶函数

箭头函数经常作为参数传递给高阶函数,如Array.prototype.mapArray.prototype.filter等:

const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map(x => x * 2);
console.log(doubled); // 输出: [2, 4, 6, 8, 10]const evens = numbers.filter(x => x % 2 === 0);
console.log(evens); // 输出: [2, 4]

Java中的 Lambda 表达式

在Java中,Lambda表达式是从Java 8开始引入的一个特性,它提供了一种清晰、简洁的方式来表示只有一个抽象方法的接口(即函数式接口)的实例。Lambda表达式允许你以匿名函数的方式编写小型、轻量级的代码块。

以下是一些Java中使用Lambda表达式的例子:

示例 1:使用Runnable接口

Runnable是一个函数式接口,它只包含一个无参数、无返回值的方法run()

// 使用匿名内部类
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Hello from thread using anonymous inner class.");}
}).start();// 使用Lambda表达式
new Thread(() -> System.out.println("Hello from thread using Lambda expression.")).start();

示例 2:使用ListforEach方法

List接口中的forEach方法接受一个Consumer函数式接口作为参数,该接口包含一个接受单个参数且没有返回值的方法accept()

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用Lambda表达式遍历列表
names.forEach(name -> System.out.println(name));

示例 3:使用Comparator接口进行排序

Comparator是一个函数式接口,用于定义对象的排序方式。它包含多个方法,但最常见的是compare(T o1, T o2)

List<String> names = Arrays.asList("Bob", "Alice", "Charlie");// 使用Lambda表达式和Comparator进行排序
Collections.sort(names, (String a, String b) -> a.compareTo(b));
System.out.println(names); // 输出排序后的列表// Java 8+ 提供了更简洁的Comparator.comparing方法
Collections.sort(names, Comparator.comparing(String::toString));
// 或者直接使用List的sort方法(无需显式Comparator)
names.sort(Comparator.comparing(String::toString));

示例 4:使用MapforEach方法

Map接口中的forEach方法接受一个BiConsumer函数式接口作为参数,该接口包含一个接受两个参数且没有返回值的方法accept()

Map<String, Integer> ageMap = new HashMap<>();
ageMap.put("Alice", 30);
ageMap.put("Bob", 25);// 使用Lambda表达式遍历Map
ageMap.forEach((name, age) -> System.out.println(name + " is " + age + " years old."));

这些例子展示了Java中Lambda表达式的多种用法,包括作为线程任务、集合遍历、排序和映射遍历的参数。Lambda表达式极大地简化了Java代码的编写,使代码更加简洁、易读。

Lambda 表达式的特点

  • 匿名:Lambda 表达式没有明确的函数名。
  • 简洁:通常用于编写单行小函数。
  • 函数对象:Lambda 表达式产生一个函数对象,可以赋值给变量或作为参数传递给其他函数。
  • 用途广泛:常用于高阶函数(接受函数作为参数或返回一个函数的函数),如 map(), filter(), sorted() 等。

注意事项

虽然 Lambda 表达式在简化代码方面非常有用,但它们并不适用于所有情况。对于复杂的逻辑,使用定义良好的函数可能更清晰、更易于维护。此外,过度使用 Lambda 表达式可能会使代码难以阅读和理解。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • idea破解激活
  • 基于飞腾平台的Kafka移植与安装
  • Occlusion in Augmented Reality
  • 上升探索WebKit的奥秘:打造高效、兼容的现代网页应用
  • 指针和const
  • 【Material-UI】Button 组件中的图标和标签按钮(Buttons with Icons and Label)详解
  • 九/十:C语言-扫雷游戏实现与函数递归
  • 初始Spring与SpringIOC容器
  • 如何根据 EcoVadis 审核的评分标准改进企业社会责任表现?
  • 【C++】| STL算法库详解 | 修改序列的算法、非修改序列的算法、排序和相关操作、数值算法
  • 【八股文】网络基础
  • rename函数报Invalid cross-device link
  • Python爬虫技术 第33节 未来趋势和技术发展
  • 新手学习Gazebo+ros仿真控制小车-----易错和自己理解
  • GPT对话代码库——串口接收16进制数据包转换成十进制输出
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2019年如何成为全栈工程师?
  • 30天自制操作系统-2
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • canvas 高仿 Apple Watch 表盘
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • golang中接口赋值与方法集
  • js递归,无限分级树形折叠菜单
  • Js基础——数据类型之Null和Undefined
  • Linux gpio口使用方法
  • React Transition Group -- Transition 组件
  • TypeScript实现数据结构(一)栈,队列,链表
  • v-if和v-for连用出现的问题
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 程序员最讨厌的9句话,你可有补充?
  • 回流、重绘及其优化
  • 技术发展面试
  • 聊聊redis的数据结构的应用
  • 前端设计模式
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深入 Nginx 之配置篇
  • 找一份好的前端工作,起点很重要
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 整理一些计算机基础知识!
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​水经微图Web1.5.0版即将上线
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $jQuery 重写Alert样式方法
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (HAL库版)freeRTOS移植STMF103
  • (Java数据结构)ArrayList
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)opengl函数加载和错误处理
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)