JDK8.0的新特性,大概有以下一些:
允许在接口中有默认方法实现;
Lambda表达式;
函数式接口以及内置函数式接口;
Stream的API;
Map;
时间和日期API;
Annotations(注解);
Lambda表达式:是对匿名内部类的一种类型简化,使用Lambda表达式的一个前提就是接口必须是一个函数式接口,也就是说接口中只能有一个抽象方法;
JDK8引入了一个新的操作符 -> ,称为箭头运算符或者叫Lambda运算符;
用法:(…) -> {…}
前面的小括号里写需要被重写的匿名内部类的方法的参数列表,不需要写类型,因为类型已经在抽象类或者接口中被定义过了;后面大括号中写上方法体即可;
代码:
第一种,没有参数没有返回值,如果后面方法体重只有一句,可以省略大括号:
import org.junit.Test;
public class Test1 {
/**
* Lambda表达式的代码演示,第一种:
* 重写的方法没有参数,没有返回值
*/
@Test
public void test1(){
//首先用Lambda来写一个接口的实现类
MyIn1 mi1 = () -> System.out.println("I love Carmelo Anthony!");
//调用方法
mi1.show();
}
}
//定义一个接口
interface MyIn1 {
public abstract void show();
}
执行结果:
I love Carmelo Anthony!
第二种,有一个参数,方法体中只有一句,而且不是返回语句:
这种只有一个参数的情况,可以把格式中的小括号去掉,即:
import org.junit.Test;
public class Test2 {
/**
* Lambda表达式的代码演示,第二种:
* 重写的方法有一个参数,没有返回值
*/
@Test
public void test1(){
//首先用Lambda来写一个接口的实现类,只有一个参数,所以表示参数列表的小括号可以省略
MyIn2 mi2 = str -> System.out.println(str);
//调用方法
mi2.show("I love Carmelo Anthony!");
}
}
//定义一个接口
interface MyIn2 {
public abstract void show(String str);
}
执行结果:
I love Carmelo Anthony!
第三种,有多个参数有返回值,方法体中只有一句,而且还是返回语句,那么可以省略return:
import org.junit.Test;
public class Test3 {
/**
* Lambda表达式的代码演示,第三种:
* 有多个参数有返回值,方法体中只有一句
*/
@Test
public void test1(){
//首先用Lambda来写一个接口的实现类,因为方法体只有一句return语句,所以直接省略return
MyIn3 mi3 = (str,name) -> (str + name);
//调用方法
String ss = mi3.show("I Love " , "Carmelo Anthony");
System.out.println(ss);
}
}
//定义一个接口
interface MyIn3 {
public abstract String show(String str,String name);
}
执行结果:
I love Carmelo Anthony!
第四种,有参数,方法体有多条语句,有返回值:
import org.junit.Test;
public class Test4 {
/**
* Lambda表达式的代码演示,第四种:
* 重写的方法有多个参数,多条语句,有返回值
*/
@Test
public void test1(){
//首先用Lambda来写一个接口的实现类
MyIn4 mi4 = (str,name) -> {
String ss = str + name;
return ss;
};
//调用方法
String ss = mi4.show("I Love " , "Carmelo Anthony");
System.out.println(ss);
}
}
//定义一个接口
interface MyIn4 {
public abstract String show(String str,String name);
}
执行结果:
I love Carmelo Anthony!
稍显啰嗦,从我的角度去理解Lambda表达式,如有错误欢迎指正!