简介
1、JDK8的新特性;
2、简化对接口的实现,方便用接口类型接收对应返回值的方法或对象。
使用规则
1、接口必须是函数式接口,即接口有且只能有一个非default修饰的方法(JDK8允许接口中的方法访问修饰符default类型。);
2、习惯用@FunctionalInterface标记接口为函数式接口,也可以不标记;
3、右边要和接口中方法的返回值一致,void不能返回值;
4、->(读作goes to)左边括号写参数列表,参数列表要么都不写类型,要么都写上类型;
5、->参数只有一个时可以省略括号;
6、->没有大括号,则表示->之后的方法体只有一行,推荐写大括号;
7、->没有大括号且只有一个返回值,则必须省略return;
8、::表示引用方法
9、::要求被引用的方法和接口中的参数一一对应;
10、::构造方法的引用也要和接口的参数一一对应。只用new就可以。
案例
package com.ctx.bean;
public class User {
private Long id;
private String name;
private int age;
public User(Long id) {
this.id = id;
}
public User() {
}
public User(Long id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
package com.ctx.impl;
import com.ctx.bean.User;
import com.ctx.inter.UserInter;
//引用方法
public class QuoteMethod {
int a=1;
//这里只能引用第三个方法
UserInter userInter = QuoteMethod::selectUser3;
//和上面的意思一样,不过这种样式可以引用下面的三种方法。
UserInter userInter2 = ( id)->selectUser3(1L);
//引用构造方法。
UserInter userInter3 =User::new;
public User selectUser(Long id) {
return new User(1L, "zhangsan", 1);
}
public static User selectUser2() {
return new User(1L, "zhangsan", 1);
}
public static User selectUser3(Long id) {
return new User(1L, "zhangsan", 1);
}
}
package com.ctx.impl;
import java.util.List;
import com.ctx.bean.User;
import com.ctx.inter.NoArgs;
import com.ctx.inter.UserInter;
//
public class UserTest {
public static void main(String[] args) {
// 有参数有返回值
UserInter userInter = (id) -> new User(1L, "zhangsan", 1);
User user = userInter.findUserById(1L);
UserInter userInter2 = (Long id) -> {
// 这里可以写业务
return new User(2L, "lisi", 2);
};
User user2 = userInter2.findUserById(2L);
// 无参数无返回值模式
NoArgs noArgs = () -> {
System.out.println("无参数无返回值模式");
};
noArgs.fun();
}
}
package com.ctx.impl;
public interface VarFinal {
public void fun(int id);
}
package com.ctx.inter;
public interface NoArgs {
public void fun();
}
package com.ctx.inter;
import java.util.List;
import com.ctx.bean.User;
@FunctionalInterface
public interface UserInter {
public User findUserById(Long id);
default List<User> findUserByName(String name) {
return null;
}
default List<User> findUserByAge(int age) {
return null;
}
}