lambada 表达式 入门

tech2025-09-28  19

Java Lambada 表达式 入门

简介

Lambada 表达式是什么?

​ 匿名函数(也叫 lambda表达式)是一个不与标识符绑定的函数。匿名函数通常是被传递给高阶函数的参数,或者用于构造需要返回函数的高阶函数的结果,在函数只使用一次,或者使用次数有限的情况下,匿名函数在语法上可能比使用命名函数更简洁。

​ 匿名函数在函数式编程和其他具有一级函数的语言中无处不在,在这些语言中,匿名函数对函数类型的作用与升序函数对其他数据类型的作用相同。

为什么使用 Lambada 表达式?

实现了函数式编程。所有新的基于JVM的语言都在他们的应用中利用了函数式范式的优势,但是在lambda表达式出现之前,程序员们只能使用面向对象编程(OOPS)。因此,lambda表达式使我们不用从头开始编写大量代码,而是从易于理解、充分测试及可靠的现有小块开始,最后将它们组合在一起以创建新代码。

参考 《on java 8》函数式编程 :https://lingcoder.gitbook.io/onjava8/13-functional-programming

使代码可读性强,更简洁。

参考《对比讲解lambda表达式与传统接口函数实现方式》 :https://juejin.im/post/6844903989834694669

易于使用 api 和库。使用lambda表达式设计的API可以更容易使用并支持其他API。

实现对并行处理的支持。lambda表达式可以让我们编写并行处理,现在每个处理器都是多核处理器。

🌰 Lambada 表达式 语法

标准语法 String[] arrays = {"I", "am", "handsome", "java", "boy", "over"}; Arrays.sort(arrays, (String m, String n) -> Integer.compare(m.length(), n.length())); System.out.println(Arrays.toString(arrays));

lambda表达式的标准语法包括以下内容:

(String m, String n) 用括号把参数括起来(单个或多个),用逗号分隔。->箭头 可当做 产出的意思箭头后面的都是方法体。

output:

[I, am, boy, java, over, handsome]

💡:

如果从上下文中可以推断出参数的类型,则可以省略该类型。在上面的代码中,m和n的类型可以推断为String,所以类型可以省略。这样就使代码更简洁,更像一个真正的lambda表达式。

String[] arrays = {"I", "am", "handsome", "java", "boy", "over"}; Arrays.sort(arrays, (m, n) -> Integer.compare(m.length(), n.length())); System.out.println(Arrays.toString(arrays));

特例,单一类型的参数推断可以这样写:

String[] arrays = {"I", "am", "handsome", "java", "boy", "over"}; Stream<String> stream = Stream.of(arrays); stream.forEach(x-> System.out.println(x));

其中 x无括号,⚠️必须是单一参数

Lambada 表达式可以用 Java 8 的方法引用来代替。

Stream<String> stream = Stream.of(arrays); stream.forEach(System.out::println);

方法引用的结构:类名或对象名,后面跟 :: ,然后跟方法名称

如果代码不能一行写完,可以用{}括起来。现在的代码应该明确包含一个返回语句。

String[] arrays = {"I", "am", "handsome", "java", "boy", "over"}; Arrays.sort(arrays, ( m, n) -> { return Integer.compare(m.length(), n.length()); }); System.out.println(Arrays.toString(arrays));

无参数的情况

当一个函数没有参数时,我们也可以用 lambda 表达式。

() -> {for(int i=0; i<10; i++) doSomthing();}

小结

​ Lambada 表达式 把函数式编程的概念引入了 java 8 中,使 javaer 不必始终用面向对象的方式来编写功能代码,使代码跟简洁易懂;但是 Lambada 本身是借助 inventorynamic 实现的(java 7 中引入),这很难说是好是坏。

摘自《on java 8》第十三章

https://lingcoder.gitbook.io/onjava8/13-functional-programming#ben-zhang-xiao-jie

​ Lambda 表达式和方法引用并没有将 Java 转换成函数式语言,而是提供了对函数式编程的支持。这对 Java 来说是一个巨大的改进。因为这允许你编写更简洁明了,易于理解的代码。

这些特性满足了很多羡慕Clojure、Scala 这类更函数化语言的程序员,并且阻止了Java程序员转向那些更函数化的语言(就算不能阻止,起码提供了更好的选择)。

但是,Lambdas 和方法引用远非完美,我们永远要为 Java 设计者早期的草率决定付出代价。特别是没有泛型 Lambda,所以 Lambda 在 Java 中并非一等公民。虽然我不否认 Java 8 的巨大改进,但这意味着和许多 Java 特性一样,它终究还是会让人感觉沮丧和鸡肋。

最新回复(0)