Java应该在哪里判断List是否为空

目录
  • 前言
  • 一个问题
  • 解决方案
  • 更好的方案
  • 总结

前言

在新的一年,我又重新回到了Java技术栈(我肯定是疯了!)。有句诗说得好,不识庐山真面目,只缘身在此山中。我仍然喜欢函数式编程,但我现在需要离它远一点,这样才能更好地理解它。

在这篇博客中,我会分享一个在项目中遇到的问题,看看能不能有更好的解决方案。

一个问题

我们有一个函数,返回的是一个Panel List

public Optional<List<Panel>> generatePanels() {
    ...
    return panels;
}

在Controller层,如果Panel List为空,我们就返回404

Optional<List<Panel>> panels = generatePanels();
if(!panels.filter(panelList -> !panelList.isEmpty()).isPresent()){
    throw new NotFoundError("There is no panel")
}

工程里调用这个函数的地方很多且逻辑一样,这也就意味着会有很多这样的重复代码。

解决方案

我们可以把判断Panel List是否为空的逻辑挪到generatePanels 函数里面

public Optional<List<Panel>> generatePanels() {
    ...
    return panels.filter(panelList -> !panelList.isEmpty());
}

这样调用该函数的地方不需要再做非空判断,我们也可以直接把Optional传给框架,由框架决定是否返回404。

但这里有一个隐式上下文,也就是我们约定generatePanels只要返回结果,就一定会返回一个非空的Panel List。我们需要时刻牢记这个约定,否则我们无法回答下面的质疑

Optional<List<Panel>> panels = generatePanels();
Panel firstPanel;
if(panels.isPresent()){
    firstPanel = panels.get().get(0); // List可能为空,这个操作会引起bug
}

我们当然可以添加一个测试来保证generatePanels永远返回非空的Panel List,我们也可以添加详尽的文档来解释这个函数的逻辑,但人们往往会忘记或忽略这些。就像超速,我们总是在提醒人们不要超速,甚至还制定了法律,但每年还是有很多人死于超速。

更好的方案

对于超速,更好的方案是从物理层面加以限制,例如在制造汽车的时候就使其速度不能超过60 km/h。

对于我们面临的问题,更好的方案是从编译器层加以限制,使其返回一个NonEmptyList。这样我们不需要额外记住任何信息,这个函数的签名就已经告诉我们它会做的事情。

以Scala代码为例

def Option[NonEmptyList[Panel]] generatePanels() {
    ...
    val panels: Option[List[Panel]] = ...
    panels.flatMap(x=> NonEmptyList.fromList(x))
}

这样我们可以很安全的拿到List的第一个元素

val panels: Option[NonEmptyList[Panel]] = generatePanels();
var firstPanel Panel;
if(panels.isSome()){
    firstPanel = panels.get().head;
}

总结

我们不应该仅仅依靠人们的脑子,我们要充分利用编译器。一个正确的函数签名可以从bug和debug中拯救我们。

在函数式编程中,我们总是在讨论side-effect。以上面的场景为例,如果函数返回了一个List,但我们真实的目的其实是返回一个非空List,那么对于调用者来说,非空的判断逻辑就是side-effect, 因为它无法从函数签名中看出来。从这个角度讲,也许我们应该允许问题中的重复代码存在,也就是说在每个调用的地方去判断Panel List是否为空。

到此这篇关于Java应该在哪里判断List是否为空的文章就介绍到这了,更多相关Java判断List是否为空内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java 判断list是否为空过程解析

    问题: 之前用 list!=null 来判断list是否为空,但发现,定义一个list后,即使里面并没有加入任何元素,返回的结果仍旧是 true, 其实,本意是希望在没有任何元素时,返回 false,下面是关于判断逻辑的详细解析: 1.如果想判断list是否为空,可以这么判断: if(list == null || list.size() ==0 ){ //为空的情况 }else{ //不为空的情况 } 2.list.isEmpty() 和 list.size()==0 的区别 答案:没有区别

  • Java应该在哪里判断List是否为空

    目录 前言 一个问题 解决方案 更好的方案 总结 前言 在新的一年,我又重新回到了Java技术栈(我肯定是疯了!).有句诗说得好,不识庐山真面目,只缘身在此山中.我仍然喜欢函数式编程,但我现在需要离它远一点,这样才能更好地理解它. 在这篇博客中,我会分享一个在项目中遇到的问题,看看能不能有更好的解决方案. 一个问题 我们有一个函数,返回的是一个Panel List public Optional<List<Panel>> generatePanels() { ... return

  • Java与JavaScript中判断两字符串是否相等的区别

    JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号则是判断两字符串的引用是否一样,判断实体需要用equals()方法,或 者compareTo()方法,这里需要强调的是equals()方法的参数类型,其参数类型绝对不是String类,而是Object类,咱不止一次看 到国内一些教程写的是String类(o(╯□╰)o) 大家可以看看JDK的源码:

  • Java基础教程_判断语句if else

    与三元运算符相比: 好处:可以简化if else 代码 弊端 因为是一个运算符,所以运算玩必须要有一个结果 以上这篇Java基础教程_判断语句if else就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Java中StringUtils工具类进行String为空的判断解析

    判断某字符串是否为空,为空的标准是str==null或str.length()==0 1.下面是StringUtils判断是否为空的示例: StringUtils.isEmpty(null) = true StringUtils.isEmpty("") = true StringUtils.isEmpty(" ") = false //注意在 StringUtils 中空格作非空处理 StringUtils.isEmpty(" ") = fals

  • Java对象类型的判断详解

    instanceof 判断某个对象是否是某个类的实例或者某个类的子类的实例.它的判断方式大概是这样的: public<T> boolean function(Object obj, Class<T> calzz) { if (obj == null) { return false; } try { T t = (T) obj; return true; } catch (ClassCastException e) { return false; } } Class.equals()

  • Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringUtils工具类判断对象是否为空是有差距的: StringUtils.isEmpty(CharSequence cs); //org.apache.commons.lang3包下的StringUtils类,判断是否为空的方法参数是字符序列类,也就是String类型 StringUtils.isEmpt

  • Java判断对象是否为空(包括null ,"")的方法

    本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下 package com.gj5u.publics.util; import java.util.List; /** * 判断对象是否为空 * * @author Rex * */ public class EmptyUtil { /** * 判断对象为空 * * @param obj * 对象名 * @return 是否为空 */ @SuppressWarnings("rawtypes") public

  • java 对称二叉树的判断

    1. 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 2. 解题思路 可以按照类似层次遍历,来判断是否是堆成二叉树: 首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同,以及左子树的右子树和右子树的左子树相同即可,然后采用递归一直判断下去. 3. 代码 public class isSymmetrical { public static void main(String[] args) { // 新建一棵二叉搜索

  • java 根据身份证号码判断出生日期、性别、年龄的示例

    1.情景展示 如何根据身份证号,计算出出生日期.性别.年龄? 2.解决方案 从网上找的别人的,因为并没有实际用到,所以并未对其优化! /**  * 通过身份证号码获取出生日期.性别.年龄  * @param certificateNo  * @return 返回的出生日期格式:1990-01-01 性别格式:F-女,M-男  */ public static Map<String, String> getBirAgeSex(String certificateNo) {     String

  • java判断list不为空的实现,和限制条数不要在一起写

    场景 很多情况下,查单条记录也用通用查询接口,但是输入的条件却能确定唯一性.如果我们要确定list中只有一条记录,如下写法: // 记录不为空 && 只有一条 才继续 if(!CollectionUtils.isEmpty(list) && 1!=list.size()){ return "记录条数不是1"; } Object object = list.get(0); 上面代码对么,貌似正确啊.后来报错了,被打脸了. 其实相当于 >0 &

随机推荐