1.基本概念:
【一】:Java8中引入了一个新的语法元素和操作符“->”,该操作符称为Lambda操作符或者箭头操作符,它将Lambda表达式分为两部分。左侧指定了Lam表达式所需的参数;右侧指定Lambda体,即要执行的功能。
【二】:Lambda表达式需要函数式接口的支持,该接口中只有一个抽象方法。并且可以使用注解@FunctionalInterface 修饰可以检查接口是否为函数时接口。
2.使用格式
格式1:无参数,无返回值
public void test1(){
int number = 0;
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Test1;"+number);
}
};
runnable.run();
//---使用Lambda表示
Runnable runnable1 = ()-> System.out.println("Test1 Lambda"+number);
runnable1.run();
}
格式二:有一個参数,无返回值。当参数个数为一时可以省略()
public void test2(){
Consumer<String> consumer = (x) -> System.out.println(x);
//Consumer<String> consumer = x -> System.out.println(x);
consumer.accept("有一個参数,无返回值");
}
格式三:有多个参数,有返回值,并且Lambda体含有多条语句
public void test3(){
Comparator<Integer> comparator = (x,y)->{
System.out.println("Lambda函数体中含有多条语句使用{}");
return Integer.compare(x,y);
};
}
格式四:有多个参数并且Lambda体含只有一条语句时可以省略{}和return
public void test4(){
Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
}
3.总结
参数只有个参数时可以省略(),Lambda体只有一条语句是可以省略{}和return。Lambda 表达式的参数列表的数据类型可以省略不写,因为JVM编译器通过上下文推断出,数据类型,这个过程即“类型推断”。
补充:常见类类型推断应用场景
String[] strs = {"a", "b”, "c","d"};
List<String> list = new ArrayList<>();
4.demo
需求:对一个数进行运算,具体的运算逻辑放到Lambda体中
1.函数式接口声明
package com.mark.java8.lambda;
/**
* Created by Choisaaaa on 2018/6/21.
* 自定义函数式接口
*/
@FunctionalInterface
public interface MyFunction {
Integer getResult(Integer number);
}
2.测试类
package com.mark.java8.lambda;
import org.junit.Test;
/**
* Created by Choisaaaa on 2018/6/21.
* 需求:对一个数进行运算,具体的运算逻辑放到Lambda体中
* 步骤1:自定义一个函数式接口
* 步骤2:编写调用接口的方法
*/
public class TestLambda3 {
@Test
public void test(){
Integer result1 = operation(100,(x) -> x*x);
System.out.println(result1);
Integer result2 = operation(100,x -> x+100);
System.out.println(result2);
Integer result3 = operation(100,x -> x-50);
System.out.println(result3);
}
public Integer operation(Integer number,MyFunction myFunction){
return myFunction.getResult(number);
}
}
3.运行结果
10000
200
50