1、为什么使用 Lambda 表达式
Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
Lambda 表达式语法
Lambda 表达式:在Java 8 语言中引入的一种新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或箭头操作符。它将 Lambda 分为两个部分:
左侧:指定了 Lambda 表达式需要的参数列表
右侧:指定了 Lambda 体,是抽象方法的实现逻辑,也即 Lambda 表达式要执行的功能。
lambda表达式代码举例实现:
import org.junit.Test;
public class TestLambda {
/*
* 演示lambda表达式第一种形式
* lambda表达式省略哪些内容 new Xxxx() 接口中方法的访问类型,返回类型,方法名。
* 省略的内容要符合合理推定这个原则。
*/
@Test
public void test1(){
//使用匿名内部类实现一个接口
Runnable run1 = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("in test1() model one");
}
};
run1.run();
//lambda表达式是的形式,lambda是为了实现一个接口。
//Runnable run2 = () -> {System.out.println("in test1() model two");};
//方法体大括号,在方法体只有一句代码的时候是可以省略的,当然也可不省略。
Runnable run2 = () -> System.out.println("in test1() model two");
run2.run();
}
@Test
public void test2(){
MyInter1 m1 = new MyInter1(){
@Override
public void methodOne() {
// TODO Auto-generated method stub
System.out.println("in test2() model one");
}
};
m1.methodOne();
MyInter1 m2 = () -> System.out.println("in test2() model two");
m2.methodOne();
}
@Test
public void test3(){
MyInter2 m1 = new MyInter2(){
@Override
public void methodOne() {
// TODO Auto-generated method stub
System.out.println("*********************");
}
@Override
public void methodTwo() {
// TODO Auto-generated method stub
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~");
}
};
m1.methodOne();
m1.methodTwo();
//lambda表达式只适用于实现只有一个方法的接口,这种接口被称作函数式接口。那么拥有两个或者两个以上方法的接口是无法进行合理推定,因此不能是lambda表达式
//MyInter2 m2 = () -> System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
}
@Test
public void test4(){
//匿名内部类
MyInter3 m1 = new MyInter3(){
@Override
public void methodOne(String s) {
// TODO Auto-generated method stub
System.out.println(s);
}
};
m1.methodOne("Hello World!");
//lambda表达式
//MyInter3 m2 = (String s) -> System.out.println(s);
//MyInter3 m2 = (s) -> System.out.println(s);//省略参数类型
MyInter3 m2 = s -> System.out.println(s);//省略参数类型,省略小括号,只有一个参数的时候才可以使用这种形式
m2.methodOne("One World One Dream!");
}
@Test
public void test5(){
//匿名内部类
MyInter4 m1 = new MyInter4(){
@Override
public String methodOne(String s, Integer i) {
// TODO Auto-generated method stub
return s+i;
}
};
String result = m1.methodOne("method", 10);
System.out.println(result);
//lambda形式
MyInter4 m2 = (s,i) -> {return s+i;};//有两个参数,所以小括号不能省略,参数类型可以省略,return关键字返回返回值,需要有大括号。
//MyInter4 m2 = (s,i) -> s+i;//return关键字也可以省略,大括号在return省略的情况下也可以省略。
String result1 = m2.methodOne("twomehtod",20);
System.out.println(result1);
}
}
interface MyInter1{
public void methodOne();
}
interface MyInter2{
public void methodOne();
public void methodTwo();
}
interface MyInter3{
public void methodOne(String s);
}
interface MyInter4{
public String methodOne(String s,Integer i);
}