JAVA函数式编程之Lambda表达式

一、概念:

  Lambda 表达式是使用最小可能语法编写的函数定义。
  
  1、 Lambda 表达式产生的是函数,而不是类。 虽然在 JVM上,一切都是类,但是幕后有各种操作执行让 Lambda 看起来像函数;
  2、 Lambda 语法尽可能少,这正是为了使 Lambda 易于编写和使用。

二、为什么使用Lambda 表达式

  Java8之前创建函数对象的主要手段就是匿名类;
 Collections.sort(words,newComparator<String>(){
    
    
        publicintcompare(Strings1,Strings2){
    
    
            returnInteger.compare(s1.length(),s2.length());
        }
    });
  然而匿名类的冗长,使得Java中的函数式编程成为一种吸引人的前景。在Java8中,语言形式化了这样的概念,特别对待抽象方法的接口。这些接口现在称为函数式接口,并且Java允许你使用lambda表达式或简称lambda来创建这些接口的实例。
Collections.sort(words,
            (s1,s2)->Integer.compare(s1.length(),s2.length()));在这里插入代码片
 Lambda在功能上与匿名类相似,但更为简洁,通常比匿名内部类产生更易读的代码

三、Lambda语法

interface Description {
    
    
  String brief();
}

interface Body {
    
    
  String detailed(String head);
}

interface Multi {
    
    
  String twoArg(String head, Double d);
}

public class LambdaExpressions {
    
    

  static Body bod = h -> h + " No Parens!"; // [1]

  static Body bod2 = (h) -> h + " More details"; // [2]

  static Description desc = () -> "Short info"; // [3]

  static Multi mult = (h, n) -> h + n; // [4]

  static Description moreLines = () -> {
    
     // [5]
    System.out.println("moreLines()");
    return "from moreLines()";
  };

  public static void main(String[] args) {
    
    
    System.out.println(bod.detailed("Oh!"));
    System.out.println(bod2.detailed("Hi!"));
    System.out.println(desc.brief());
    System.out.println(mult.twoArg("Pi! ", 3.14159));
    System.out.println(moreLines.brief());
  }
}
===========================================================
/* Output:
Oh! No Parens!
Hi! More details
Short info
Pi! 3.14159
moreLines()
from moreLines()
*/

**任何 Lambda 表达式的基本语法是:**

1、参数
2、-> 	方法通用标识(个人理解)   
3、-> 之后的内容方法体
     [1] 当只用一个参数,可以不需要括号 ()。 然而,这是一个特例。
     [2] 正常情况使用括号 () 包裹参数。 为了保持一致性,也可以使用括号 () 包裹单个参数,虽然这种情况并不常见。
     [3] 如果没有参数,则必须使用括号 () 表示空参数列表。
     [4] 对于多个参数,将参数列表放在括号 () 中。
     [5] 如果Lambda 表达式方法体是单行。 该表达式的结果自动成为 Lambda 表达式的返回值,在此处使用 return 关键字是非法的。 这是 Lambda 表达式简化相应语法的另一种方式。
     [6] 如果在 Lambda 表达式中是多行,则必须将这些行放在花括号中。 在这种情况下,就需要使用 return。

四、Lambda 表达式应用

    1、计算阶乘
import org.junit.Test;

interface IntCall {
    
    
  int call(int arg);
}


public class RecursiveFactorial {
    
    
  static IntCall intCall;

  private static void calculatingFactorial() {
    
    
    intCall = n -> n == 0 ? 1 : n * intCall.call(n - 1);
  }

  @Test
  public void test() {
    
    
    calculatingFactorial();
    for(int i = 0; i <= 5; i++) {
    
    
      System.out.println(intCall.call(i));
    }
  }
  
}

2、Fibonacci 序列

public class RecursiveFibonacci {
    
    
  IntCall fib;
  RecursiveFibonacci() {
    
    
    fib = n -> n == 0 ? 0 :
               n == 1 ? 1 :
               fib.call(n - 1) + fib.call(n - 2);
  }
  int fibonacci(int n) {
    
    
    return fib.call(n);
  }

  public static void main(String[] args) {
    
    
    RecursiveFibonacci rf = new RecursiveFibonacci();
    for(int i = 0; i <= 10; i++) {
    
    
      System.out.println(rf.fibonacci(i));
    }
  }
}

猜你喜欢

转载自blog.csdn.net/heijunwei/article/details/111406113