阅读时间: 4 分钟
Java中的Lambda表达式

由于Java 8是在2014年发布的,它带来了很多新的功能和变化。在这些变化中,有一些功能允许Java开发者以函数式编程风格进行编写。为了支持函数式编程风格,一种语言需要支持函数作为第一类公民。最大的变化之一是增加了lambda表达式。
因为组织慢慢转向Java 8和Java 11平台,越来越多的开发者发现有机会使用lambda表达式。它将开发工作简化了很多。
什么是Lambda表达式?
一般来说,Lambda表达式是java中的一个函数,它可以不属于任何类而被创建。一个Lambda表达式(函数)是一个匿名函数,例如:一个没有名字和任何标识符的函数。
Lambda表达式是Java中函数式编程的基础,换句话说,Lambda表达式是java中函数式编程的第一步。兰姆达表达式是Java 8中一个非常新的、令人兴奋的功能。
为什么它们被称为 "lambda函数"?
在数学中,Lambda函数是指将一组分配的变量映射到一个计算中。
比如说。
(x) = x2
(x, y) = x + y
对于第一个方程,如果x是4,该函数将评估为16。对于第二个函数,如果x和y都是3,结果是6。
Lambda表达式的语法
在λ运算符->的左边指定输入参数(如果有的话),在λ运算符的右边放置表达式或语句块。
例如,lambda表达式(a, b)-> a + b指定lambda表达式接受两个参数a和b并返回它们的总和。
(parameter_list) -> {function_body}
(a,b) -> a+b // it returns the sum of two numbers
它们可以在程序中的任何地方调用,并且可以被传递。简单地说,lambda表达式允许函数表现得像另一个数据。
这些是lambda表达式的重要内容。
-
如果没有多个参数,那么我们就不需要在括号中声明单个参数。
-
如果 表达式主体包含单个语句,那么 我们就不需要在表达式主体中使用大括号,因为大括号是可选的。
-
如果主体有一个单一的表达式来返回值,那么编译器会自动返回该值。
-
对于无参数语法
() -> System.out.println("No parameter lambda");
- 有一个参数时 语法
(str) -> System.out.print(str); // single argumment, lambda expression
- 有多个参数时 语法
(x, y) -> System.out.println("Multiple parameters: " + x +", "+y);
为什么我们在Java中使用lambda表达式?
- 因为它 ,在Java中实现了函数式编程。
- 在Java中编写可维护的、可读的、简洁的代码。
- 如果 一个变量的类型 是一个只有一个方法的接口,那么Lambda表达式就可以存储在变量中 。
- 为了非常容易和有效地使用API,我们在Java中使用lambda表达式。
- Java lambda表达式通常用于实现简单的事件监听器 或回调。换句话说, 它在 函数式编程中使用了 Java Streams API。
- 因为它可以减少代码的行数。
功能性接口为什么要写lambda函数。
在Java 8之前,我们必须创建一个内部匿名类来使用这些接口。
例如:不使用lambda表达式。
// functional interface before java 8
class Test
{
public static void main(String args[])
{
// create anonymous inner class object
new Thread(new Runnable()
{
@Override
public void run() // anonymous class
{
System.out.println("Thread created");
}
}).start();
}
}
通过使用Lambda表达式我们可以通过使用功能接口来创建一个lambda表达式,而不是创建匿名的内部类。
功能性接口
Lambda表达式只能实现功能接口,即只有一个抽象方法的接口。同样地,兰姆达表达式本质上是为功能接口中的抽象方法提供主体。
如果接口中有多个抽象方法,编译器将不知道哪个方法应该使用λ表达式作为其主体。
要使用lambda表达式,我们需要创建自己的函数式接口。另一方面,我们可以使用Java.util包提供的预定义的函数式接口。
比如说,Runnable, Callable, ActionListener等。
这类接口被称为功能接口,它们被注解为@FunctionInterface 。最好的做法是在任何功能接口的顶部添加可选的@FunctionalInterface 注释。
通过创建功能接口来演示Java中lambda表达式的工作程序。
// creating functional interface
@FunctionalInterface
interface MyFunctionalInterface {
void operation(int a, int b);
}
创建类
//creating class
public class LambdaTest1 {
public static void main(String[] args) {
// Lambda Expreassion 1
MyFunctionalInterface f = (int a, int b) -> {
return a + b;
};
System.out.println(f.operation(4, 5));// 9
// Lambda Expreassion 2
MyFunctionalInterface f2 = (a, b) -> a * b;
System.out.println(f2.operation(2, 5)); // 10
// Lambda Expreassion 3
MyFunctionalInterface f3 = (a, b) -> a / b;
System.out.println(f2.operation(20, 5)); // 4
}
}
带有单参数 和单语句
// creating functional interface
@FunctionalInterface
interface StringOpr {
public int getLength(String str);
}
//creating class
public class Main {
public static void main(String[] args) {
// Lambda Expreassion 1
StringOpr length= (str-> str.length();
System.out.println("String length: "+length.getLength("hello"));
}
}
使用预定义的功能接口,通过使用Lambda创建一个线程
package learn.java.lambda;
public class ThreadDemo {
public static void main(String[] args) {
// first thread
// Here we are using Runnable interface
Runnable thread1 =()->{
// body of thread
for (int i=0; i<5; i++)
{
try {
System.out.println("Thread is running");
Thread.sleep(1000);
}catch (InterruptedException e)
{
e.printStackTrace();
}
}
};
Thread t =new Thread(thread1);
t.start();
}
}
将Lambdas作为对象传递
我们可以把lambda作为参数传递给其他函数。例如,我们正在创建一个打招呼的程序。
package learn.java.lambda;
// creating functional interface
@FunctionalInterface
public interface Greeting {
String greet(String msg);
}
package learn.java.lambda;
public class Wisher {
public static void wish(Greeting greeting) {
System.out.println(greeting.greet("Morning")); //Output: Good Morning Buddy
System.out.println(greeting.greet("Evening")); //Output: Good Evening Buddy
}
// Passing a lambda expression to the wish method
public static void main(String args[]) {
wish((msg) -> "Good " +msg+ " Buddy");
}
}
总结
在这篇博客中,我们已经了解了Lambda表达式。兰姆达表达式是一个强大的工具,它减少了代码行数,为在Java 8中实现函数式编程提供了途径。
Java Lambda表达式在实时软件开发中非常有用。