java13都已经来了,不少同窗还停留在使用java5的东西。若是在平常开发中没有使用上java8的一些新特性或者不会用。这篇文章对你可能有帮助。java
lambda表达式是java8出的一种新的语法,经过匿名调用的方式使代码更加优雅。web
为了更友好的支持lambda表达式,在java8引入了函数式接口的概念。api
@FunctionalInterface
注解在接口上进行声明 。因此你看到的接口上有这个注解的都是函数式接口。先看下面一段代码安全
@Test
public void FunctionalInterface(){
new Thread(new Runnable() {
@Override
public void run() {
print();
}
});
new Thread(
() ->{print();}
);
new Thread(() -> print());
new Thread(this::print);
}
public void print(){
System.out.println("hello domain");
}
复制代码
上面的Runnable接口就是一个函数式接口, 第一种建立接口实例的方式使传统的匿名内部类。其他三种方式是使用lambda建立的接口实例。第一种没啥好说的,对其他三种的语法说明下。bash
() -> {}
,小括号里面的就是接口方法的传参,大括号里面的就是方法里面的逻辑。能够对照匿名实现接口的方式来看。@Test
public void testFunctionalInterface(){
WebService webService = this::print;
webService.sayHi("domain");
}
public void print(String str){
System.out.println("hi:"+str);
}
复制代码
上面例子能够看到两个点, 第一个就是上面说的有参数的lambda实践,第二个是lambda表达式返回的确实是一个接口的实现实例。dom
方法引用有三种方式,类名::方法
,对象::方法
,类名::new
,最后这个语法是引用的构造方法。ide
stream
是java8对集合(不包括map)新增的一个api,配合lambda,更好的对集合进行各类操做。函数
先建立一个list集合,使用stream来对它操做。ui
List<User> users = new ArrayList<>();
users.add(new User("domain",18));
users.add(new User("alex",19));
users.add(new User("lily",20));
users.add(new User("joy",21));
复制代码
对集合中的数据进行过滤, 使用filter方法,好比我要拿到集合中年龄大于18的人:this
List<User> users = users.stream()
.filter(new Predicate<User>() {
@Override
public boolean test(User user) {
return user.getAge() > 18;
}
}).collect(Collectors.toList());
复制代码
能够看到,匿名内部实现的那一块,能够用lambda表达式来实现:
List<User> users = users.stream()
.filter(user -> user.getAge() > 18).collect(Collectors.toList());
复制代码
说明:user.stream来得到steam对象,filter进行过滤,collect来生成过滤后的对象,由于原对象不会改变。
把集合类型和元素改变, 若是我要拿到集合中全部的姓名集合:
users.stream()
.filter((user) -> user.getAge() > 18)
.map(User::getName)
.forEach(System.out::println);
复制代码
这样就是输出全部的姓名。map以后能够经过刚刚的collect转为一个新的集合对象。例子中没有这样作,是经过forEach将每一个元素输出出来。
寻找集合中的元素,进行匹配。
如今我要知道集合中是否存在
domain
这个名字的人
boolean anyMatch = users.stream().anyMatch(user -> "domain".equals(user.getName()));
复制代码
集合中的名字是否都叫
domain
boolean allMatch = users.stream().allMatch(user -> "domain".equals(user.getName()));
复制代码
集合中是否没有
domain
姓名的人
boolean noneMatch = users.stream().noneMatch(user -> "domain".equals(user.getName()));
复制代码
Optional
是Java8提供的为了解决null安全问题的一个API,讲通俗点就是对数据的判空检查。来看下面的例子
user = userService.getUser();
if (user == null) {
throw new Excepiton("用户不存在");
}
复制代码
能够看到为了对数据的判空, 代码变得很是冗长。Optional 提供了一套API 能使得这种判空检查变得优雅些。
User user = Optional.ofNullable(userService.getUser()).orElseThrow(() -> new Exception("用户为空为空"));
复制代码
上面经过调用orElseThrow
在user
为空时,抛出对应异常。Optional.ofNullable
是指定要操做的对象。
String name = Optional.ofNullable(user.getPerson().getName()).orElseGet(() -> "domain");
复制代码
使用orElseGet
来设置对象为空时,返回的默认值。