一:Lambda 表达式
Lambda 表达式新的语法元素和操作符。这个操作符为 “->” ,被称 为 Lambda 操作符或剪头操作符。
左侧:指定了 Lambda 表达式需要的所有参数
右侧:指定了 Lambda 体,即 Lambda 表达式要执行 的功能。
Runnable runnable=new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
};
//等效于上面
Runnable runnable= () -> System.out.println("hello");
二:函数式接口
只包含一个抽象方法的接口,称为函数式接口。
可以通过 Lambda 表达式来创建该接口的对象。
三:Stream流
1.Collectors.toList()
List<Long> idList = users.stream().map(User::getId).collect(Collectors.toList());
2.Collectors.toMap()
两个参数:
List<User> userList = new ArrayList<>();
userList.add(new User(1, "张三", 18));
userList.add(new User(2, "李四", 19));
userList.add(new User(3, "王五", 18));
//将userList转化为key为id,value为User对象的map
Map<Long, User> map = userList.stream().collect(Collectors.toMap(User::getId, p -> p));
两个参数结果:
{
1: User(1, "张三", 18)
2: User(2, "李四", 19)
3: User(3, "王五", 18)
}
三个参数:(a, b) -> b的意思就是,如果存在重复的,永远取后面一个
Map<Integer, String> map = userList.stream().collect(Collectors.toMap(User::getAge, User::getName, (a, b) -> b));
三个参数结果:
{
18: "王五"
19: "李四"
}
3.Collectors.groupingBy()
Map<Integer, List<User>> map = userList.stream().collect(Collectors.groupingBy(User::getAge));
结果:
{
18: [User(1, "张三", 18), User(3, "王五", 18)]
19: [User(2, "李四", 19)]
}
四:Optional 类
isPresent() : 判断是否有值
get():返回里面的对象
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
map():映射,可以用lambda表达式获取里面对象的值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
public String getName(User user){
Optional<User> u = Optional.ofNullable(user);
if(!u.isPresent()){
return "Unknown";
}else return u.get().name();
}
简化:
public String getName(User user){
return Optional.ofNullable(user).map(u -> u.name).orElse("Unknown");
}