Java 8新特性:Lambda 表达式、函数式接口、Stream流、Optional 类

一: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");
}

你可能感兴趣的:(java,开发语言)