Java8 - Lambda表达式指南和实例

283 阅读4分钟

java Lambda Expression examples

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

java8的Lambda表达式

Lambda表达式是java8中为实现函数式编程而引入的一个重要功能。

这种表达式可以创建一个具有功能接口实现的匿名类。Anonyms类没有名字。

功能性接口只包含单一的抽象方法,在java8中被引入,以实现java语言的功能性编程。

如何在Java7中编写Lambda表达式?

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

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);
}

输出

4

Java8 Lambda表达式示例

同样的功能用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);
}  

输出

4

lambda的语法是什么?

Lambda Expression 可以用下面的语法来创建。

它使用一个arrow operator ,其中包含hyphen ,后面是greater ,比一个符号。

arrow operator 的左边包含parameters 。箭头运算符的右侧有expressionstatements

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

Parameters:这些都是或空或非空的左侧箭头运算符的值。expression :如果指定了表达式,则semicolon ,不需要,curly braces ,是可选的语句。如果有多个语句,必须用curly braces ,并且需要在语句的末尾加上分号。这包含了lambda表达式的表达式/正文。

如何编写零参数的lambda表达式?

Lambda表达式可以用空括号来写,后面是一个箭头符号和一个单一的语句。语句不需要{}和返回语句。

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

如何写有一个参数的lambda表达式?

这是一个在lambda表达式中写单参数的例子

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

如何编写带有多个参数的lambda表达式?这是一个在lambda表达式中使用多个参数的例子。

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

兰姆达表达式的特点

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

Lambda表达式的优点

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

Lambda表达式的劣势

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

兰姆达表达式的例子

下面的部分包含了经常使用的Lambda表达式使用例子。不带参数的Lambda表达式 例子这个表达式可以不带参数地定义。该功能接口只有一个抽象方法。

@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();
}

输出

Hi, How are you?  

Lambda Expression单参数示例这里定义了单参数。参数可以用括号括起来。

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);

}  

输出

2  
5  

Lambda表达式双参数示例

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

  1. Lambda Expression定义了两个参数,参数类型在此没有声明,类型是由参数的值推断出来的。
  2. Lambda Expression定义了两个参数,它们的类型包含在其中。
  3. Lambda Expression的定义没有返回关键字。当没有定义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);

}  

输出

17  
48  
76  

使用lambda表达式用For Each遍历数组列表的例子

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

Lambda表达式与一个参数一起使用,该参数包含一个ArrayList的迭代对象。

import java.util.ArrayList;
import java.util.List;

public class LamdaExpressionWithParametersExample {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(1);
        list.add(6);
        list.add(8);
        list.forEach((value) -> System.out.println(value));
    }
}

输出

1  
6  
8  

结论

在这篇文章中,我们学习了完整的java8中的lambda表达式的教程,并举例说明。