添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

59.md

File metadata and controls

Java Lambda 表达式教程

原文: https://beginnersbook.com/2017/10/java-lambda-expressions-tutorial-with-examples/

Lambda 表达式是 Java 8 中引入的一个新特性。λ 表达式是一个匿名函数。一个没有名称且不属于任何类的函数。 lambda 表达式的概念最初是在 LISP 编程语言中引入的。

Java Lambda 表达式语法

要创建 lambda 表达式,我们在 lambda 运算符 -> 的左侧指定输入参数(如果有的话),并将表达式或语句块放在 lambda 运算符的右侧。例如,lambda 表达式 (x, y) -> x + y 指定 lambda 表达式接受两个参数 x y 并返回这些参数的总和。

//Syntax of lambda expression
(parameter_list) -> {function_body}

Lambda 表达式与 Java 中的方法

Java 中的方法(或函数)具有以下主要部分:

  • 返回类型。
  • Java 中的 lambda 表达式具有以下主要部分: Lambda 表达式 仅具有主体和参数列表

  • 没有 名称 - 函数是匿名的,所以我们不关心名称
  • 正文 - 这是函数的主要部分。
  • 没有 返回类型 - java 8 编译器能够通过检查代码来推断返回类型。你不必明确提及它。
  • 在 Java 中使用 Lambdas 的位置

    要使用 lambda 表达式,您需要创建自己的函数式接口或使用 Java 提供的预定义函数式接口。只有单个抽象方法的接口称为函数式接口(或单抽象方法接口),例如: Runnable callable,ActionListener 等。

    使用函数式接口:

    Java 8 之前:我们创建匿名内部类。 Java 8 之后:您可以使用 lambda 表达式而不是匿名内部类。

    Java Lambda 表达式示例

    **不使用 Lambda 表达式:**在 java 8 之前,我们使用匿名内部类来实现函数式接口的唯一抽象方法。

    import java.awt.*;  
    import java.awt.event.*;  
    public class ButtonListenerOldWay {  
        public static void main(String[] args) {  
           Frame frame=new Frame("ActionListener Before Java8");  
           Button b=new Button("Click Here");  
           b.setBounds(50,100,80,50);  
           b.addActionListener(new ActionListener(){  
              public void actionPerformed(ActionEvent e){  
        	     System.out.println("Hello World!"); 
           frame.add(b);
           frame.setSize(200,200);  
           frame.setLayout(null);  
           frame.setVisible(true);   
    

    **使用 Lambda 表达式:**我们可以像这样创建一个 lambda 表达式,而不是创建匿名内部类:

    import java.awt.*;  
    public class ButtonListenerNewWay {  
       public static void main(String[] args) {  
          Frame frame=new Frame("ActionListener java8");  
          Button b=new Button("Click Here");  
          b.setBounds(50,100,80,50); 
          b.addActionListener(e -> System.out.println("Hello World!")); 
          frame.add(b);
          frame.setSize(200,200);  
          frame.setLayout(null);  
          frame.setVisible(true);   
    
  • 正如您所看到的,我们使用较少的代码与 lambda 表达式。
  • 向后兼容性:您可以将 lambda 表达式与旧代码一起使用。 Lambdas 是向后兼容的,因此当您将项目迁移到 Java 8 时,可以在现有 API 中使用它们。
  • 让我们看几个 Lambda 表达式的例子。

    示例 1:没有参数的 Java Lambda 表达式

    @FunctionalInterface
    interface MyFunctionalInterface {
    	//A method with no parameter
        public String sayHello();
    public class Example {
       public static void main(String args[]) {
            // lambda expression
        	MyFunctionalInterface msg = () -> {
        		return "Hello";
            System.out.println(msg.sayHello());
    
    Hello

    示例 2:具有单个参数的 Java Lambda 表达式

    @FunctionalInterface
    interface MyFunctionalInterface {
    	//A method with single parameter
        public int incrementByFive(int a);
    public class Example {
       public static void main(String args[]) {
            // lambda expression with single parameter num
        	MyFunctionalInterface f = (num) -> num+5;
            System.out.println(f.incrementByFive(22));
    

    示例 3:具有多个参数的 Java Lambda 表达式

    interface StringConcat {
        public String sconcat(String a, String b);
    public class Example {
       public static void main(String args[]) {
            // lambda expression with multiple arguments
        	StringConcat s = (str1, str2) -> str1 + str2;
            System.out.println("Result: "+s.sconcat("Hello ", "World"));
    
    Result: Hello World

    示例 4:使用foreach循环迭代集合

    import java.util.*;  
    public class Example{  
        public static void main(String[] args) {       
           List<String> list=new ArrayList<String>();  
           list.add("Rick");         
           list.add("Negan");       
           list.add("Daryl");         
           list.add("Glenn");         
           list.add("Carl");                
           list.forEach(          
               // lambda expression        
               (names)->System.out.println(names)         
    

    我们可以使用 lambda 表达式迭代 Maps 和其他集合类,参考本指南:使用 lambda 表达式迭代 Map 和 List