Java8 - 通过教程和实例在10分钟内学会Lambda表达式的教程

98 阅读3分钟

在这篇博文中,我将结合实例介绍java8 Lambda表达式的基础知识。

兰姆达表达式简介

Lamda表达式是java8中引入的重要功能。

这个表达式可以创建一个具有Interfaces接口实现的Anonyms类。隐名类没有名字。

功能性接口只包含单一的抽象方法,在java8中被引入以实现java语言的功能性编程。请看我以前关于函数式接口的文章。另一种方法是用方法引用来表示类的方法的函数式编程。请看我之前关于方法引用的文章。

Java7的Lambda表达式,在Java8之前

在java8之前,没有lambda表达式,我们将创建一个接口实现的anonyms类。

public class AnonymousClassesExample {  
 public static void main(String[] args) {  
  MathOperation mo = new MathOperation() {  
   @Override  
   public int add(int a, int b) {  
    return (a + b);  
   }  
  };  
  System.out.println(mo.add(1, 3));  
 }  
}  
interface MathOperation {  
 public int add(int a, int b);  
}

Java8兰姆达表达式示例

用Lambda表达式重写同样的功能。代码的数量减少了。

public class LamdaExpressionExample {  
 public static void main(String[] args) {  
  MathOperation math=(a,b)->(a + b);  
  System.out.println(math.add(1, 3));  
 }  
  
}  
@FunctionalInterface  
interface MathOperation {  
 public int add(int a, int b);  
}  

语法

兰姆达表达式可以用以下语法创建。它使用一个箭头运算符,包含连字符和大于符号。箭头运算符的左边包含参数。箭头运算符的右边是表达式或语句。

(Parameters) --> expression or   
(Parameters) --> {statements;}  

参数--这些都是箭头运算符左侧的或空或非空的值 箭头运算符符号表达式--如果指定了这个,则不需要分号,大括号是可选的 语句--如果有多个语句,必须用大括号括起来。 并需要在语句的末尾加上分号 这包含表达式/lambda表达式的正文

零参数

() -> System.out.println("Lambda Expression without Arguments");  

一个参数

(value) --> System.out.println("Lambda Expression with one Arguments"+value);  

多参数

(value1, value2) --> System.out.println("Lambda Expression with one Arguments"+value1+value2);  

特征

这些是没有名字的函数--反义词函数
体包含零个或多个语句。如果是单个语句,不需要大括号。如果是多个语句,应该用大括号括起来
默认不需要返回关键字。匿名函数的返回类型与语句的值类型相同。
这些都被映射到功能接口中。

优势

允许通过函数接口进行函数式编程。
减少代码行数 这与流API相结合,在数据结构的并行迭代中更有效率。

缺点

  • 发生错误时很难进行调试
  • 难以轻松理解代码

Lamda表达式示例

下面的部分包含了经常使用的Lambda表达式的使用例子 没有参数的Lamda表达式例子 Lamda表达式的定义是没有参数的。功能性接口只有一个抽象的方法。@FunctionalInterface注解是可选的,不需要。

public class LamdaExpressionWithoutParametersExample {  
 public static void main(String[] args) {  
  Message msg = () -> {  
   return "Hi How are you?";  
  };  
  System.out.println(msg.getMessage());  
 }  
}  
@FunctionalInterface  
interface Message {  
 public String getMessage();  
}

Lamda表达式单参数示例 这里定义了单参数Lamda表达式。参数可以用括号括起来。

public class LamdaExpressionWithParametersExample {  
 public static void main(String[] args) {  
  // Lamda expression single argument enclosed in braces  
  MathOperation math = (value) -> {  
   return value + 1;  
  };  
  // Lamda expression single argument without braces  
  MathOperation math1 = value -> {  
   return value + 1;  
  };  
  System.out.println(math.incrementByOne(1));  
  System.out.println(math1.incrementByOne(4));  
  
 }  
  
}  
  
interface MathOperation {  
 public Integer incrementByOne(Integer i);  
  
}  

Lamda表达式双参数示例

这个例子包含了各种用例的用法

  1. 有两个参数的Lamda表达式,参数类型没有被声明,类型是由参数的值推断出来的。
  2. 有两个参数的Lamda表达式,其类型包含在其中。
  3. 定义了没有返回关键字的Lamda表达式。当没有定义return关键字时,不需要使用大括号。
public class LamdaExpressionWithParametersExample {  
 public static void main(String[] args) {  
  // Lamda expression two argument without type of argument  
  MathOperation math = (v1, v2) -> {  
   return v1 + v2;  
  };  
  // Lamda expression two arguments with type of argument  
  MathOperation math1 = (Integer v1, Integer v2) -> {  
   return v1 + v2;  
  };  
  // Lamda expression two arguments without return type  
  MathOperation math2 = (Integer v1, Integer v2) -> (v1 + v2);  
  
  System.out.println(math.add(11, 6));  
  System.out.println(math1.add(45, 3));  
  System.out.println(math2.add(45, 31));  
 }  
}  
  
interface MathOperation {  
 public Integer add(Integer v1, Integer v2);  
  
}  

For Each 示例

这是一个列表对象或原始类型的forEach例子。

List list = new ArrayList();  
  list.add(1);  
  list.add(6);  
  list.add(8);  
  list.forEach((value) -> System.out.println(value));