Java编程技巧:if-else优化实践总结归纳

说实话,其实我很讨厌在代码里大量使用if-else,一是因为该类代码属于面向过程的,二嘛,则是会显得代码过于冗余。这篇笔记,主要记录一些自己在工作实践当中针对if-else的优化心得,将会不定期地长期更新。


一、使用策略枚举来优化if-else

看到网上蛮多人推荐使用策略模式来优化if-else,但我总觉得,搞一堆策略类来优化if-else,虽然想法很好,但无意之中很可能又会创造出很多类对象,就显得过于重量了。其实,若想使用策略模式来优化if-else,其实有一种更好的方式,这是策略模式+枚举方式的改良,我以前写过这样一篇优化文章,详细直接点击该文了解:《策略枚举:消除在项目里大批量使用if-else的优雅姿势》


二、使用三目运算符来优化if-else

1、根据if-else条件来判断赋值的,如:

String; if(flag){; }else{; }

利用三目运算符,可以直接优化成一行代码:

id=flag?"a":"b";

2、利用if-else条件来判断调用方法,如:

Set<String> set1=new HashSet<>(); Set<String> set2=new HashSet<>(); if(flag){ set1.add(id); }else{ set2.add(id); }

利用三目运算符,可以直接优化成:

Set<String> set1=new HashSet<>(); Set<String> set2=new HashSet<>(); (flag?set1:set2).add(id);
三、使用Stream优化if中判断条件过多情况 Jdk1.8新特性Stream流有三个这样API,anyMatch,allMatch,noneMatch,各自的作用如下:

anyMatch:判断条件里任意一个满足条件,则返回true;

allMatch:判断条件里所有都满足条件,则返回true;

noneMatch:判断条件里所有都不满足条件,则返回true;

它们的使用方式其实很简单:

List<String> list = Arrays.asList("a", "b", "c","d", ""); //任意一个字符串判断不为空则为true boolean anyMatch = list.stream().anyMatch( s->StringUtils.isEmpty(s)); //所有字符串判断都不为空则为true boolean allMatch = list.stream().allMatch( s->StringUtils.isEmpty(s)); //没有一个字符判断为空则为true boolean noneMatch = list.stream().noneMatch( s->StringUtils.isEmpty(s));

可见,根据以上三种实现方式,可以在某种程度上优化if里判断条件过多的情况,那么,在哪种场景里比较合适利用其优化呢?

在日常实际开发当中,我们可能会看到过这样存在很多判断条件的代码:

if(StringUtils.isEmpty(str1) || StringUtils.isEmpty(str2) || StringUtils.isEmpty(str3) || StringUtils.isEmpty(str4) || StringUtils.isEmpty(str5) || StringUtils.isEmpty(str6) ){ ..... }

这时,就可以考虑到,使用stream流来优化,优化后的代码如下:

if(Stream.of(str1, str2, str3, str4,str5,str6).anyMatch(s->StringUtils.isEmpty(s))){ ..... }

这样优化后,是不是就比那堆if里堆积到一块的条件更为优雅了?

当然,这只是针对或条件的,若是遇到与条件时,同样可以用Stream来优化,例如:

if(StringUtils.isEmpty(str1) && StringUtils.isEmpty(str2) && StringUtils.isEmpty(str3) && StringUtils.isEmpty(str4) && StringUtils.isEmpty(str5) && StringUtils.isEmpty(str6) ){ ..... }

使用Stream优化后:

if(Stream.of(str1, str2, str3, str4,str5,str6).allMatch(s->StringUtils.isEmpty(s))){ ..... }
四、使用Map优化if-else 优化量比较多的面向过程的if-else语句,还可以考虑使用Map来优化,虽然在一定程度上,创建一个额外map会占用内存,但那丁点内存对于现阶段计算机而言,可以说不足挂齿。 下面使用一个案例来介绍下————

在一些祖传老代码当中,可能遇到过类似这样又臭又冗余的if-else写法:

public String getDay(String day){ if("Monday".equals(day)){ return "今天上英语课"; }else if("Tuesday".equals(day)){ return "今天上语文课"; }else if("Wednesday".equals(day)){ return "今天上数学课"; }else if("Thursday".equals(day)){ return "今天上音乐课"; }else if("Sunday".equals(day)){ return "今天上编程课"; }else{ ...... } }

这时,可以根据具体场景,来考虑是否可以利用Map优化,使用Map优化的方式,是先在该类中定义一个static的map,类似这样:

public static final Map<String,String> dayMap= ImmutableMap.<String, String>builder() .put("Monday","今天上英语课") .put("Tuesday","今天上语文课") .put("Wednesday","今天上数学课") .put("Thursday","今天上音乐课") .put("Sunday","今天上编程课") .build();

定义完后,就直接在先前使用if-else的方法里,进行这样优化:

public String getDay(String day){ return dayMap.get(day); }

这样优化后,业务方法里的判断获取值的处理,是不是就清爽了很多,当然,这只是针对量比较多的if-else而言,若是比较少的判断语句,再额外定义一个map来搞,隐约有画蛇添足的嫌疑。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyjpxd.html