JAVA中的 lambda

本文探讨Java中的新特性,包括Lambda表达式的使用,函数式编程的概念及其优势,如参数类型自动推断、更易实现并行操作等。同时介绍了函数式接口的定义与识别,并通过具体示例解释了如何正确应用这些新特性。

1 、 不再使用java util Date

  这是一个可变的对象。破坏了对象的不可变性。应该使用 LocalDate

2、函数式编程

自学

3、参数类型自动推断,代码简洁

4、更容易的并行

lambda表达式可以使用在任何有函数式接口的地方

只有一个抽象方法的接口是函数式接口

Public interface UserMapper{

Int insert();

}    √是函数式接口

 

Public interface UserMapper{

default Int insert();

}   默认方法 不是

 

Public interface UserMapper{

static Int insert();

} 静态方法不是

 

Public interface UserMapper{

Public Int hashCode();

}  Object对象中的方法也不是函数式接口

 

@FunctionInterface  这个注解帮助我们标注函数式接口

Java.util.function 包中几乎全部都是函数式接口

459061f5abdc2065747db89ca062a29b437.jpg

 

 

 

学习lambda 最重要的两点 1范型,  2函数式接口

 

lambda表达式是对象,是一个函数式接口的实例

a4339f96ff9f48cb2ac31251df7d9afb502.jpg

 

 

左边是参数 ,右边是体

 

57b12ec1a327efa23480c8f07a69608242a.jpg

65380d67682d63c726e22f7dcb1f6201cf5.jpg

 

 

其中第五个 ,没有返回值也可以那么写

参数是0个或者多个不能省略参数的小括号

de182690b78d137508aa1791d2eba542434.jpg

  1. 要么全部省略参数类型,要么都不省略
  2. lambda的参数不能使用 final修饰
  3. 不能把lambda赋给非函数式接口
  4. 如果非要把lamdba赋值给非函数式接口,需要把lambda强转成函数式接口
  5. 不需要也不允许使用throws语句来声明它可能会抛出的异常。

 

一看参数,二看返回值。

2.方法的引用

ad1d16718fdceb418deb448bd3baf0e1d1b.jpg

78203d2fe890f6c352aad2df70e43ad7b43.jpg

ec21526c1f1360a72a8e0d0208f6e2d3ad6.jpg

 

 

 

 

转载于:https://my.oschina.net/u/3018126/blog/3081092

<think>我们正在讨论Java中的lambda表达式。根据用户的问题,他们想了解lambda表达式的含义和用法,并请求提供示例。同时,我们需要参考之前提供的引用内容,特别是引用[1]中关于lambda表达式的语法示例,以及引用[2]中关于lambda表达式用于简化接口实现和保持逻辑简洁的建议。回答结构:1.介绍lambda表达式的含义:是什么,为什么引入(简化代码,函数式编程)。2.基本语法:参考引用[1]的三种形式。3.核心应用场景:替代匿名内部类、集合操作(如forEach,filter)、函数式接口的实现。4.注意事项:根据引用[2]强调逻辑不宜过于复杂,复杂逻辑应封装为方法并在lambda中调用。5.示例:提供几个典型示例,包括线程创建、集合遍历、自定义函数式接口等。注意:引用[3]是一段宣传性的文字,没有实质技术内容,所以不考虑。另外,根据系统指令,我们需要注意数学表达式(如果有)用$...$,但本问题中可能较少涉及,但代码块要使用代码格式。同时,生成相关问题。由于用户的上一次问题中我们实际上已经详细回答了lambda表达式的含义和用法,并且现在用户再次提问,可能是希望更简洁或重点突出的回答,因此我们这次要参考之前的回答,但更聚焦于用户当前问题,并且参考引用[1]和[2]。此外,在回答末尾添加相关问题。</think> ### Java Lambda表达式详解 #### 一、核心含义 Lambda表达式是Java 8引入的**函数式编程语法**,用于替代匿名内部类,实现更简洁的代码。本质上是**可传递的代码块**(即行为参数化),其核心符号`->`将参数列表与函数体分离。 #### 二、基本语法结构 根据引用[1][^1]的定义: ```java // 表达式格式 (参数) -> 单行表达式 // 隐式返回结果 (参数) -> { 多行语句 } // 需显式return ``` **具体形式**: 1. **无参数** `() -> System.out.println("Hello")` 2. **单参数**(可省略括号) `s -> s.toUpperCase()` 3. **多参数** `(a, b) -> a + b` 4. **带代码块** ```java (x, y) -> { int sum = x + y; return sum * 10; } ``` #### 三、核心应用场景 1. **替代匿名内部类**(线程示例) ```java // 传统写法(匿名内部类) new Thread(new Runnable() { @Override public void run() { System.out.println("Running"); } }).start(); // Lambda写法[^1] new Thread(() -> System.out.println("Running")).start(); ``` 2. **集合操作**(遍历与过滤) ```java List<String> languages = Arrays.asList("Java", "Python", "C++"); // 遍历(引用方法更简洁)[^2] languages.forEach(s -> System.out.println(s)); // 等效于 forEach(System.out::println) // 过滤(长度>4) List<String> filtered = languages.stream() .filter(s -> s.length() > 4) .collect(Collectors.toList()); // ["Python"] ``` 3. **函数式接口实现** ```java // 定义函数式接口 @FunctionalInterface interface Operation { int execute(int a, int b); } // Lambda实现 Operation add = (x, y) -> x + y; System.out.println(add.execute(3, 5)); // 输出 8 ``` #### 四、设计原则与限制 1. **逻辑简洁性** 如引用[2]强调:Lambda中**不宜包含复杂逻辑**,否则会降低可读性[^2]。 ✅ 推荐做法: ```java // 复杂逻辑封装为方法 boolean isComplex(String s) { //... 复杂判断 } list.filter(s -> isComplex(s)) // Lambda引用封装方法 ``` 2. **变量捕获规则** - 只能访问 final 或**等效 final** 的外部变量 ```java int base = 10; // 等效final Function<Integer, Integer> adder = x -> x + base; ``` - 禁止修改外部变量(编译错误) `x -> base++` // ❌ 编译报错 #### 五、与匿名内部类的对比 | 特性 | Lambda表达式 | 匿名内部类 | |---------------------|---------------------------|-----------------------| | **语法简洁性** | ⭐⭐⭐ (极简) | ⭐ (冗余) | | **作用域** | 继承外围类的this | 创建自己的作用域 | | **字节码生成** | 运行时动态生成 | 编译时生成独立.class | | **适用场景** | 单一抽象方法的接口 | 任意接口/抽象类 | > Lambda表达式是Java迈向函数式编程的关键特性,配合`Stream API`可实现声明式集合操作,提升代码可读性和可维护性[^1]。 ### 常见问题示例 **Q:Lambda中实现字符串拼接** ```java BinaryOperator<String> concat = (s1, s2) -> s1 + " " + s2; System.out.println(concat.apply("Hello", "Lambda")); // 输出 Hello Lambda ``` **Q:作为返回值传递** ```java public static Comparator<String> lengthComparator() { return (s1, s2) -> s1.length() - s2.length(); } // 使用: Collections.sort(list, lengthComparator()); ``` **Q:嵌套Lambda(谨慎使用)** ```java Function<String, Function<String, String>> greeter = name -> greeting -> greeting + ", " + name; System.out.println(greeter.apply("Alice").apply("Hello")); // Hello, Alice ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值