一个 if 语句包含一个布尔表达式和一条或多条语句。
如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。
if 语句后面可以跟 else if…else 语句,这种语句可以检测到多种可能的情况。
使用 if,else if,else 语句的时候,需要注意下面几点:
示例
根据学生的成绩,将60分以下的记为【差】,60分-75分的记为【中】,75分到90分记为【良】,90分及以上的记为【优】。
使用 if...else...if...else... 的写法就像下面一样:
/**
* @Description 根据分数判断等级
* @Title scoreLevel
* @Param [score]
* @Return java.lang.String
* @Author Louis
* @Date 2022/01/22 15:10
*/
public static String scoreLevel(int score){
if( score < 60 ){
return "差";
} else if ( score < 75 ){
return "中";
} else if ( score < 90 ){
return "良";
} else {
return "优";
}
}
随着项目中越来越多的这种 if...else...if...else... 的写法,会导致代码看起来特别臃肿,阅读起来也非常的不便,会被别人说看起来像 “
” 一样的代码。
今天 Louis 来教你一种高端写法,【枚举】听过吧?【流】听过吧? 好的,你现在已经会了!!!
只需要使用 Java8 的语法特性,就可以轻松干掉 if-else,瞬间从菜鸟晋升到大神。
创建一个枚举类,包含属性 level(等级),min(最小值),max(最大值),并提供参数的get() 方法。
/**
* @ClassName ScoreLevelEnum
* @Description 分数等级
* @Author Louis
* @Date 2022/01/22 15:15
*/
public enum ScoreLevelEnum {
LEVEL_4("差", Integer.MIN_VALUE, 59),
LEVEL_3("中", 60, 74),
LEVEL_2("良", 75, 89),
LEVEL_1("优", 90, Integer.MAX_VALUE),
;
// 等级
private final String level;
// 最小值
private final int min;
// 最大值
private final int max;
ScoreLevelEnum(String level, int min, int max) {
this.level = level;
this.min = min;
this.max = max;
}
public String getLevel() {
return level;
}
public int getMin() {
return min;
}
public int getMax() {
return max;
}
}
方法调用:
import louis.score.ScoreLevelEnum;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* @ClassName Test
* @Description 测试
* @Author Louis
* @Date 2022/01/22 14:57
*/
public class Test {
public static void main(String args[]){
int score = 85;
String level = Arrays.asList(ScoreLevelEnum.values())
.stream()
.filter(e -> e.getMin() <= score && score <= e.getMax())
.collect(Collectors.toList())
.get(0)
.getLevel();
System.err.println(level);
}
}
运行结果:
什么?看不懂?手把手一步一步教你看:
1、调用枚举类的 values() 方法,返回枚举数组。
ScoreLevelEnum[] values = ScoreLevelEnum.values();
2、将数组转为 List,方便调用 Java8 Stream API。
List<ScoreLevelEnum> scoreLevelEnums = Arrays.asList(ScoreLevelEnum.values());
3、获取 List 的流 Stream。
Stream<ScoreLevelEnum> stream = Arrays.asList(ScoreLevelEnum.values()).stream();
4、调用 Stream 的 filter(Predicate<? super T> predicate) 方法进行过滤,传入lambda 表达式的条件判断 score 大于等于最小值,小于等于最大值。
Stream<ScoreLevelEnum> stream = Arrays.asList(ScoreLevelEnum.values())
.stream()
.filter(e -> e.getMin() <= score && score <= e.getMax());
5、将流的返回值收集为新的结果,返回值为 List。
List<ScoreLevelEnum> collect = Arrays.asList(ScoreLevelEnum.values())
.stream()
.filter(e -> e.getMin() <= score && score <= e.getMax())
.collect(Collectors.toList());
6、因为满足条件的只会有一个结果,所以直接获取List中的第0位元素就是枚举 ScoreLevelEnum 对象,再调用对象的 getLevel() 方法获取值。
String level = Arrays.asList(ScoreLevelEnum.values())
.stream()
.filter(e -> e.getMin() <= score && score <= e.getMax())
.collect(Collectors.toList())
.get(0)
.getLevel();
e -> e.getMin() <= score && score <= e.getMax() 将整个代码的核心由 if 判断巧妙的转化为 Lambda 表达式,将主动权交给调用方解决。