首页
学习
活动
专区
圈层
工具
发布
清单首页Java文章详情

一行代码的高端操作 Enum + Stream 教你彻底干掉 if...else...

前言

Java 条件语句 if...else... 是项目中必不可少可是学习软件开发的必经之路,我们先来看看传统的 if...else...

if...else 语句

一个 if 语句包含一个布尔表达式和一条或多条语句。

如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。

if...else if...else 语句

if 语句后面可以跟 else if…else 语句,这种语句可以检测到多种可能的情况。

使用 if,else if,else 语句的时候,需要注意下面几点:

  • if 语句至多有 1 个 else 语句,else 语句在所有的 else if 语句之后。
  • if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
  • 一旦其中一个 else if 语句检测为 true,其他的 else if 以及 else 语句都将跳过执行。

Java 8 Stream

  • Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
  • Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
  • 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
  • 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

示例

根据学生的成绩,将60分以下的记为【差】,60分-75分的记为【中】,75分到90分记为【良】,90分及以上的记为【优】。

低端操作

使用 if...else...if...else... 的写法就像下面一样:

代码语言:javascript
复制
/**
 * @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() 方法。

代码语言:javascript
复制
/**
 * @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;
    }

}

方法调用:

代码语言:javascript
复制
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() 方法,返回枚举数组。

代码语言:javascript
复制
ScoreLevelEnum[] values = ScoreLevelEnum.values();

2、将数组转为 List,方便调用 Java8 Stream API

代码语言:javascript
复制
List<ScoreLevelEnum> scoreLevelEnums = Arrays.asList(ScoreLevelEnum.values());

3、获取 List 的流 Stream

代码语言:javascript
复制
Stream<ScoreLevelEnum> stream = Arrays.asList(ScoreLevelEnum.values()).stream();

4、调用 Stream 的 filter(Predicate<? super T> predicate) 方法进行过滤,传入lambda 表达式的条件判断 score 大于等于最小值,小于等于最大值。

代码语言:javascript
复制
Stream<ScoreLevelEnum> stream = Arrays.asList(ScoreLevelEnum.values())
                .stream()
                .filter(e -> e.getMin() <= score && score <= e.getMax());

5、将流的返回值收集为新的结果,返回值为 List。

代码语言:javascript
复制
List<ScoreLevelEnum> collect = Arrays.asList(ScoreLevelEnum.values())
                .stream()
                .filter(e -> e.getMin() <= score && score <= e.getMax())
                .collect(Collectors.toList());

6、因为满足条件的只会有一个结果,所以直接获取List中的第0位元素就是枚举 ScoreLevelEnum 对象,再调用对象的 getLevel() 方法获取值。

代码语言:javascript
复制
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 表达式,将主动权交给调用方解决。

下一篇
举报
领券