
在这篇博文中,我将结合实例介绍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 。箭头运算符的右侧有expression 或statements
(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表达式双参数示例
这个例子包含了各种用例的用法
- Lambda Expression定义了两个参数,参数类型在此没有声明,类型是由参数的值推断出来的。
- Lambda Expression定义了两个参数,它们的类型包含在其中。
- 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表达式的教程,并举例说明。