Java8 Lambda表达式的快速上手进阶版
函数式接口要点:
1.用于接口的实现
2.类上声明@FunctionalInterface 注解用于标记这是一个函数式接口
3.接口中只有一个方法
4.基本语法:(形参列表)->{实现代码}
使用lambda表达式的方式(也是匿名内部类)
语法:((接口名)(形参)->{代码body}).方法名(参数);
形参列表,是可以省略变量类型的,但注意要省略都得省略
lambda可以快速实现一个函数式接口,Runnable接口就是一个很好的例子。
1.Runnable 接口使用了@FunctionalInterface修饰
2.Runnable 接口中只有一个run方法
package advance;
/**
* 函数式接口要点:
* 1.用于接口的实现
* 2.类上声明@FunctionalInterface 注解用于标记这是一个函数式接口
* 3.接口中只有一个方法
* 4.基本语法:(形参列表)->{实现代码}
*/
@FunctionalInterface
public interface Read {
String ReadSth(String name);
}
package advance.imp;
import advance.Read;
import org.junit.Test;
/**
* @ClassName fushaokai
* @Description TODO
* @Version 1.0
**/
public class Book implements Read {
@Override
public String ReadSth(String name) {
System.out.println("read 哈利波特");
return "哈利波特";
}
/**
* 传统实现接口的方式
*/
@Test
public void Test1(){
Read read = new Book();
read.ReadSth("沉船");
}
/**
* 使用匿名内部类的方式(new 接口)
*/
@Test
public void Test2(){
new Read(){
@Override
public void ReadSth(String name) {
System.out.println("read "+name);
}
}.ReadSth("生与死");
}
/**
* 使用lambda表达式的方式(也是匿名内部类)
* 语法:((接口名)(形参)->{代码body}).方法名(参数);
*
* 对比于上面的内部类
* 在lambda表达式中保留了形参列表部分和方法体部分,对于无关紧要的代码则做了省略。
* 如果接口中有多个方法,按照这种省略的格式是无法指明对哪个方法进行了重写,这就是为什么要强调函数式接口的原因。
* 我们目前可以理解为lambda对类似于匿名内部类方式创建对象的简化 (这是个人理解,后面还写到可以接收函数的返回值)。
* 既然要创建对象,那么就需要知道所创建对象的类型,此处即为绿色部分的(WacthSome)。
*/
@Test
public void Test3(){
((Read)(name)->{
System.out.println("read "+name);
}).ReadSth("奥利给");
}
/**
* 接口带参数的方法
*形参,名字是可以不同的,此处注意方法的重写(返回类型、形参顺序、形参类型)。
*形参列表,是可以省略变量类型的,但注意要省略都得省略
*/
@Test
public void Test4(){
((Read)(bookName)->{
System.out.println("read"+ bookName);
}).ReadSth("厚礼谢");
}
/**
* 接口带参数和返回值
* body里面用return
*/
@Test
public void Test5(){
((Read)(bookName)->{
System.out.println("read"+ bookName);
return bookName;
}).ReadSth("厚礼谢");
}
/**
* lambda可以快速实现一个函数式接口,Runnable接口就是一个很好的例子。
*
* 1.Runnable 接口使用了@FunctionalInterface修饰
* 2.Runnable 接口中只有一个run方法
*/
@Test
public void Test6(){
Runnable r = ()->{
System.out.println("进了run方法..");
};
new Thread(r).start();
/*其中的r是可以替换的,直接简写为:*/
new Thread(()->{
System.out.println("run 方法");
}).start();
}
}
1.在上文中,我们在使用lambda表达式时,(类型)好像时有时无?
位置不一样
A.情景一
( (WacthSome) () -> System.out.println(“now : watch noName”) )
.wacthSth();
在方法体中,通过lombda表达式()->得到了一个实例(或者带返回值/这个实例调用方法产生了个返回值)。
但是你并不知道这个实例它究竟是谁,所以需要显式声明类型。
B.情景二
new Thread(
() -> {System.out.println(“run方法222…”);
}).start();
这个位置是在形参(Thread的构造函数)中,是默认有类型的。
在new Thread()的括号中按下ctrl+p可以看到需要的参数列表。