Java 8 Lambda表达式
Lambda 表达式,也可以称为闭包,他是Java 8最重要的特性.
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中).
使用Lambda表达式可以使代码简洁紧凑.
语法
(parameters) -> expression
或
(parameters) ->{ statements; }
重要特性
- 可选类型声明:不需要声明参数类型,编译器统一识别参数值.
- 可选的参数圆括号:一个参数无需定义圆括号
- 可选的大括号:如果主题包含了一个语句,就不需要使用大括号.
- 可选的返回关键字
表达式实例:
//1.不需要参数,返回
() -> 5
//2.接收一个参数(数字类型),返回
x -> 2 * x
//3.接收两个参数(数字),返回
(x,y) -> x - y
//4.接收两个参数(数字)返回
(x,y) -> x + y
//5.接收一个 String 对象,并在控制台打印
(String s) -> System.out(s)
@Test
public void fl(){
Moth m1 =(int a,int b) -> a+b;
int fun = m1.fun(2, 3);
System.out.println(fun);
}
interface Moth{
int fun(int x,int y);
}
- Lambda 表达式主要用来定义行内执行的方法类型接口.例如上边的例子.
- Lambda表达式免去了使用匿名函数的麻烦,并且给予java简单但是强大的函数化编程能力.
可以在Lambda表达式中访问外层的局部变量:
public class Java8Tester {
public static void main(String args[]) {
final int num = 1;
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2); // 输出结果为 3
}
public interface Converter<T1, T2> {
void convert(int i);
}
}
在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
String first = "";
Comparator<String> comparator = (first, second) -> Integer.compare(first.length(), second.length()); //编译会出错
lambda 表达试,简单的讲就是匿名函数.
示例如下:
@Test
public void fl2() {
// 测试功能型
// 平方
Integer aInteger = new Integer(12);
String string = "outerline";
Function<Integer, Integer> function = a -> {
return a * a;
};
System.out.println("功能型接口 :" + function.apply(aInteger));
// 测试供给型接口
// 生成一个随机数
Supplier<Integer> supplier = () -> {
Random random = new Random();
return random.nextInt(45);
};
System.out.println("供给型接口 " + supplier.get());
// 断言式接口
// 判断一个数是否大于0
Predicate<Integer> predicate = a -> {
return a > 0;
};
System.out.println("断言式接口 " + predicate.test(18));
Predicate<String> p = a -> {
return a.length() > 4;
};
// 消费性接口
// 输出输入的参数
Consumer<String> consumer = a -> {
System.out.println("消费性接口内部 " + a.length() + " " + string);
};
System.out.println("调用消费性接口");
consumer.accept("xiaofeixingjiekoucanshu");
}
//功能型接口 :144
//供给型接口 26
//断言式接口 true
//调用消费性接口
//消费性接口内部 23 outerline