使用java8之前,一直在写一些枯燥的if else,不能说有什么不好,只是在我们有了java8 之后我们再遇到这种需要写if 的场景下,又多了一种选择。好了不多废话直接上干货。
首先我们先分析一下,我们平时需要作判断的场景大概就是如下几种
if(...){
}
if(...){
}else{
}
if(...){
}else if(...){
}else{
}
看过我的上一篇文章 java 8 stream表达式中实现if/else逻辑
的肯定已经知道了,我们new 一个以Boolean 为key的Map,然后通过判断key去执行不同的方法就可以了,但这种方法只能适用于第一种和第二种,遇到第三种就头大了,那怎么办呢。别急,各位看官,听小生给您娓娓道来。
比如我们有如下场景:
public AppUser chooseUser(Integer choosenUserId){
if(choosenUserId==1){
return getUser1();
}else if(choosenUserId==2){
return getUser2();
}else {
return getUser3();
}
}
看起来很闹心对不对,别急我们先来看看Supplier源码吧
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
我们可以看到suppler正好是一个供给型接口,刚好满足我们的业务需求,然后我们就可以把我们的代码做如下改动
public static AppUser chooseUser(Integer chooseUserId){
Map<Integer, Supplier<AppUser>> map = new HashMap<>();
map.put(1,Test4::getUser1);
map.put(2,Test4::getUser2);
map.put(3,Test4::getUser3);
return map.get(chooseUserId).get();
}
这样看起来貌似是符合了我们的需求,但是如果我们的需求是所有不满足1和2的都要走supplier3这个逻辑,于是我又想到了Optional的orElse
choosenUserId = Optional.ofNullable(choosenUserId).filter(c->c==1||c==2).orElse(3);
最终实现的代码如下:
public static AppUser chooseUser(Integer chooseUserId){
Map<Integer, Supplier<AppUser>> map = new HashMap<>();
chooseUserId = Optional.ofNullable(chooseUserId).filter(c->c==1||c==2).orElse(3);
map.put(1,Test4::getUser1);
map.put(2,Test4::getUser2);
map.put(3,Test4::getUser3);
return map.get(chooseUserId).get();
}
这样看起来是满足了我们的业务需求,但是各位看官姥爷又说了,你搞了这么多反而还把逻辑写复杂了,看来好麻烦,还不如我写if else来的简单 方便。呃。。。。。。。貌似确实是这个道理,所以这个只是一个简单的例子啦。实际应用中大家还是要视情况而定啦,反正这个锅我不背,啦啦啦!