Java中Lambda表达式的简要介绍

183 阅读5分钟

阅读时间: 4 分钟

Java中的Lambda表达式

java logo with lambda expression

由于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表达式在实时软件开发中非常有用。