Lambda
Lambda表达式作为Java 8中的新特性, 帮助我们开发者简化代码,更好的进行函数式编程,有必要详细了解它的用法。
- What
- Why
- How
What
- Lambda表达式基于数学中的λ演算得名,而它并不是Java独有的,在别的语言中也广泛被使用,Lambda作为函数式编程中的基础部分,直接对应于其中的lambda进行抽象,同时它也是匿名函数,即没有函数名的函数。实质上可以实现某一接口的匿名内部类的中的方法 ,抛弃多余的代码,直接写出最重要的逻辑代码,正因为它是匿名函数,我们也不需要在起名上浪费时间。
- 组成部分:
a. 括号包起来的参数
b. 箭头 ( -> 操作符)
c. 方法体,可以是单个语句,也可以是语句块
Why
- 提供了更为简单的语法和写作方式
- 取代匿名内部类
- 简化代码,干净整洁
How
- 取代匿名内部类
//不使用Lambda
public void testRunable() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("No Lambda Test");
}
}).start();
}
//使用Lambda
public void testRunable() {
new Thread(() -> System.out.println("Lambda Test")).start();
}
- 集合进行迭代
这时就需要了解Java 8同时出的 java.util.stream类,封装了一些集合类,就重要的写几个例子。
forEach
//forEach:迭代集合中所有的对象
public static void LambdaList() {
List<String> lists = Arrays.asList("Lambdas", "Default Method", "java", "Android");
// 原方法输出
for (String list : lists) {
System.out.println(list);
}
// 基本lambda输出
lists.forEach(n -> System.out.println(n));
// 进化; 方法引用使用::双冒号操作符表示
lists.forEach(System.out::println);
}
map (重点)
//map:将一个对象变换为另外一个
private static void LambdaMapReduce() {
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
// 每一个数加1.2倍-------原来的方法
for(Integer cost :costBeforeTax) {
double price=cost+1.2*cost;
System.out.println(price);
}
// 每一个数加1.2倍,然后输出------Lambda表达式
costBeforeTax.stream().map(n -> n + n * 1.2).forEach(System.out::println);
// 用map在数列中加逗号
List<String> mapTest = Arrays.asList("qwerert", "asdasdddasd", "test");
String joinTest = mapTest.stream().map(str -> str.toUpperCase()).collect(Collectors.joining(", "));
System.out.println(joinTest);
}
reduce
// Reduce:将所有值合并为一个
private static void LambdaMapReduce() {
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
double result=costBeforeTax.stream().map(m ->m*1.2).reduce((sum,m)->sum+m).get();
System.out.println(result);
}
filter
//filter:比较过滤
private static void lambdaFilter() {
List<Integer> costBeforeTax=Arrays.asList(100,200,300,400,500);
costBeforeTax.stream().filter(n->n>=300).forEach(System.out::println);
}
总结
关于Java的Lambda表达式还有很多需要学习的地方,这些只不过是简单的一些用法,随着函数式编程的发展,Lambda表达式的作用会越来越大,同时简洁优雅也是它的一大特色,有句话说的好,简洁优雅就是生产力,还能炫技,简直爽到不行。