java8 supplier干掉if else

使用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来的简单 方便。呃。。。。。。。貌似确实是这个道理,所以这个只是一个简单的例子啦。实际应用中大家还是要视情况而定啦,反正这个锅我不背,啦啦啦!

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容