当前位置: 首页 > 知识库问答 >
问题:

使用lambda优化if else语句,以防止null检查?

冀冯浩
2023-03-14

我有下面这个例子,感觉可读性不是很好。由于getStudents()可能为null,getTests()也可能为null,所以我必须进行大量检查。我必须执行isStudentsAvailable()和isStestAvailable()。

我如何将这个例子转移到不需要那些检查的lambda表达式中呢?会很乐意得到一些暗示。谢谢

      if(school.isStudentsAvailable()){
        sendMailtoStudents(school.getStudents());
        
        if(school.getStudents().isTestAvailable()) {
        printTests(school.getStudents().getTests());
         }
      }

共有1个答案

齐成双
2023-03-14

由于getStudents()可能为null,getTests()也可能为null,所以我必须进行大量检查

啊,你有代码味。

有很多方法可以处理NUI的概念(未初始化、未知、不相关)。null是一种方法,Optional之类的包装类型是另一种方法,annotations是第三种方法,sentinel值是第四种方法。

但听起来这不是NUI的案子!听起来getStudents()返回null作为一种表达方式:有零个学生。

换句话说,它传达的是空的,而不是nui。

用null表示empty是错误的,因为与NUI不同,empty具有适合您的类型的约定的语义含义。school.getStudents返回一个列表(或set、collection、map或array--某种表示集合的类型),所有这些类型都能够很好地表示空类型。

换句话说,修复方法是转到getStudents方法的代码,并将returnull替换为returnlist.of();

那么您的调用代码就简单多了。而不是:

List<Student> students = getStudents();
if (students != null) {
    for (Student student : students) {
        // code here
    }
}

它简化为:

for (Student student : getStudents()) {
    // code here
}

哪个眼球会立刻喜欢,毫无疑问。读起来容易多了。

但是,假设您不能更改getStudents,因为它是提供的。

然后,当API设计得如此糟糕以至于濒临崩溃时,您应该做的就是编写一个包装器:

public static List<Student> fixedGetStudents(School school) {
    List<Student> students = school.getStudents();
    return students == null ? List.of() : students;
}

那就叫。每次使用它时都尝试‘修复它’意味着每次要使用getStudents时都在编写代码来解决潜在的无效性,这是一个样式错误,因为它违反了DRY(不要重复自己)。

 类似资料:
  • 我对where条件、order by和limit有一个查询。我使用准备好的语句来设置where条件和限制。当前,我使用字符串append作为order,从而导致SQL注入漏洞。

  • 本文向大家介绍Mysql查询语句优化技巧,包括了Mysql查询语句优化技巧的使用技巧和注意事项,需要的朋友参考一下 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等。这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整理的,主要是查询语句上面的优化,其它层面的优化技巧在此不做记录。 查询的开销指标: 执行时间 检查的行数 返回的行数

  • 我是Java编程的初学者。我是在编写一个基于prime checker的程序时遇到这个问题的。已经明确指出,; 编辑器中锁定的代码将使用一个或多个整数参数调用checkPrime方法。您应该以这样的方式编写checkPrime方法:代码只打印素数。请仔细阅读编辑器中给出的代码。也请不要使用方法重载! 我想知道下面的评论行w. r. t.下面的Java程序之后的声明的作用是什么? 它们在锁定代码中的

  • 问题内容: 我有一个结构的SQLite表“ Details”: 我想随机选择一行,然后从三个不同的行中选择三个名称(同样最好随机选择)。我希望所有这些都可以从一个SQLite语句返回。例如 我的尝试可以从下面看到,但是有两个问题: 这三个额外的名称不一定总是不同的-我似乎无法排除先前选择的名称,因为变量b / c / d不在其自身的COALESCE函数范围内。 由于每个嵌套选择都使用Random(

  • 我用R编写了以下代码,效果很好。但是,假设我必须对具有多个级别的因子变量应用类似的代码(

  • null 它是功能性的,但丑陋,不是“最佳实践”。怎么简化呢?