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 特性一样,它终究还是会让人感觉沮丧和鸡肋。