(公司有新的项目终于开始用jdk1.8了,回忆一下实习期间的学习记录,今天又在蚂蚁课堂上看了下)
1.FunctionalInterface函数式接口
有且只有一个抽象方法即为函数式接口,但是可以加Object类的equals方法
/**
* @author wk
* @Description:JDK1.8,接口定义 default、static关键字修饰方法可以有方法体
*
* @date 2019/8/9 13:56
**/
@FunctionalInterface
public interface UserService {
void addUser(String name, int age);
/**
* default可以被子类重写
*
* @param user
*/
default String getUser(User user) {
return user.getUserName();
}
/**
* 静态方法不能被子类继承
*
* @param user
*/
static void staticUser(User user) {
System.out.println("static 方法 " + user.getUserName());
}
/**
* 允许Object的equals方法
*
* @param obj
* @return
*/
boolean equals(Object obj);
}
静态方法直接使用类名调用就可以,UserService.staticUser(user);
2.lambda表达式
@FunctionalInterface
public interface FunctionMemberInterface {
void addUser(List<User> list, User user);
default String getUser(User user) {
return user.getUserName();
}
/**
* 静态方法不能被子类继承
*
* @param user
*/
static void staticUser(User user) {
System.out.println("static 方法 " + user.getUserName());
}
/**
* 允许Object的equals方法
*
* @param obj
* @return
*/
boolean equals(Object obj);
}
@FunctionalInterface
public interface FunctionUserInterface {
String getUserName(User user);
}
public class FunctionInterfaceTest {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
//1.8之前 匿名内部类的方式 ,代码冗余
FunctionMemberInterface functionMemberInterface = new FunctionMemberInterface() {
@Override
public void addUser(List<User> list, User user) {
list.add(user);
System.out.println(list.get(0).getUserName());
}
};
functionMemberInterface.addUser(list, new User("李白", 18));
//一般先写(形参),->,主体代码{} ,接口 T t =
FunctionMemberInterface memberInterface = (userList, user) -> {
userList.add(user);
System.out.println("userName: " + userList.get(0).getUserName());
System.out.println("userAge:" + userList.get(0).getUserAge());
};
memberInterface.addUser(list, new User("杜甫", 11));
FunctionUserInterface functionUserInterface = (user) -> {
System.out.println("只有返回语句,可以不加大括号");
return user.getUserName();
};
FunctionUserInterface functionUserInterface2 = (user) -> user.getUserName();
System.out.println(functionUserInterface.getUserName(new User("张飞", 44)));
System.out.println(functionUserInterface2.getUserName(new User("张飞", 44)));
}
}
3.方法的引用
(大概只是用一下工具类的方法引用吧)
public class MethodReferenceTest {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("李白");
arrayList.add("杜甫");
arrayList.add("姜维");
arrayList.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
arrayList.forEach((t) -> {
System.out.println(t);
});
//方法的引用,在lambda基础上简化代码
arrayList.forEach(System.out::println);
}
}