在这篇博文中,我将结合实例介绍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表达式双参数示例
这个例子包含了各种用例的用法
- 有两个参数的Lamda表达式,参数类型没有被声明,类型是由参数的值推断出来的。
- 有两个参数的Lamda表达式,其类型包含在其中。
- 定义了没有返回关键字的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));