Java Lambda表达式是Java8 引入的一个新的特性,它类似于JavaScript中的闭包,主要目的是让我们的代码变的更加简洁紧凑。
1. Lambda 基本语法
Lambda 的基本语法格式如下两种形式:
(parameters) -> expression
或
(parameters) ->{ statements; }
其中,包括几项重要特征:
- 编译器可以统一识别参数,不需要指定类型 例如
(a) - > System.out.println(a)
- 当只有一个参数时,不用写括号 例如
a ->System.out.println(a)
- 参数可以为空
() ->System.out.println("hello world")
- 参数指定类型时,必须有括号
(String a) -> System.out.println("hello world")
常见实例
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
2. Lambda 的作用
Lambda 主要是以函数式接口为基础,来定义内执行的方法的接口。免去了使用匿名方法的麻烦,给Java赋予了强大的函数化编程能力
举例
以前我们新建一个Thread
,Runnable
接口是我们操作多线程时的一个常用的接口,只包含void run()
方法。在以前,我们如果新建一个线程,需要如下写法:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world;");
}
}).start();
现在,有个Lambda表达式,就可以非常简介的写出上述代码:
new Thread(() -> System.out.println("Hello world")).start();
也可以写成
Runnable r = () -> System.out.println("Hello World");
new Thread(r).start();
还有一个我们常用的比较器
Integer a[] = {8,3,7,1,7,4,2,7};
Arrays.sort(a, new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer t1) {
return integer - t1;
}
});
现在可以写成
Integer a[] = {8,3,7,1,7,4,2,7};
Arrays.sort(a, (a1 , a2)-> a1-a2);
3. Stream 对象
Stream
对象也是java8新添加的一个新加入的API,主要用于对Collection
对象功能的增强,对各种集合对象进行各种非常遍历、高效地聚合或大批量操作。Stream API通过借助Lambda表达式,可以极大的提高编程效率喝程序可读性。
包括的主要方法:
forEach 用来迭代流中的每个元组,下面是例子:
List<String> strings = Arrays.asList("abc", "123", "bc", "efg", "abcd","", "jkl");
//逐个打印集合中的元素
strings.stream().forEach(System.out::println);
map用来映射每个元素到对应的结果
List<Integer> list = Arrays.asList(1,2,3,4,5);
//把list中的所有元素加2
List<Integer> slist = list.stream().map(i->i+2).collect(Collectors.toList());
filter用于通过设置好的条件对集合中的元素进行过滤
List<String>strings = Arrays.asList("abc", "12313123", "bc", "efg", "abcd","", "jkl");
// 获取长度大于3的字符串的数量
long count = strings.stream().filter(string -> string.length() > 3).count();
limit 用于获取指定数量的流
List<String> strings = Arrays.asList("abc", "123", "bc", "efg", "abcd","", "jkl");
//打印集合中的3条元素
strings.stream()。limit(3).forEach(System.out::println);
sorted 方法用于对流进行排序。
List<String> strings = Arrays.asList("abc", "12313123", "bc", "efg", "abcd","", "jkl");
//正序
strings.stream().sorted().forEach(System.out::println);
//倒序 strings.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println);