java - 使用 anyMatch 的流中的空安全

标签 java string list null java-stream

这是对“If statement - variable order for null safety”的后续问题

假设我有一个“响应”对象列表。这包括一个字符串值,说明"is"或“否”。

如果所有成员都回答“YES”,则返回“YES”。如果至少一名成员回答“否”,则返回“否”。 换句话说,如果列表包含"is"和“否”响应的混合,则答案为“否”。否则,答案为"is"。 (假设"is"和“否”是唯一的选择)。

String dummy_method(List<Response> myList) {
    if(myList.isEmpty()) {
        return null; 
    }
    String firstResponseValue = myList.get(0).getYesOrNoValue(); 
    if ("NO".equalsIgnoreCase(firstResponseValue)) {
        return firstResponseValue; 
    }
    return myList.stream.anyMatch(response -> !response.getYesOrNoValue().equalsIgnoreCase(firstResponseValue)) ? "NO" : firstResponseValue;
}

是否有一种“优雅”的方式来确保最后一个返回语句中的空安全:

return myList.stream.anyMatch(response -> !response.getYesOrNoValue().equalsIgnoreCase(firstResponseValue)) ? "NO" : firstResponseValue;

比如用

if ("NO".equalsIgnoreCase(firstResponseValue))

最佳答案

您可以使用以下代码段:

String dummy_method(List<Response> myList){
    final boolean allMatch = myList.stream()
        .map(Response::getYesOrNoValue)
        .allMatch("YES"::equals);

    return allMatch ? "YES" : "NO";
}

allMatch的使用和使用倒置的anyMatch是一样的,我只是更喜欢前者,但你也可以这样写:

String dummy_method(List<Response> myList){
    final boolean anyMatch = myList.stream()
        .map(Response::getYesOrNoValue)
        .map(value -> value == null ? "NO" : value) // since we compare to "NO", we have to convert nulls
        .anyMatch("NO"::equals); // changed from "YES" to "NO"

    return anyMatch ? "NO" : "YES"; // flipped "YES" and "NO"
}

两者都短路了,所以它们的行为完全一样。


你也可以使用 for 循环:

String dummy_method(List<Response> myList){
    for(Response response : myList){
        if(response != null && "NO".equals(response.getYesOrNoValue())){
            return "NO";
        }
    }
    return "YES";
}

这可能是所有三个解决方案中最简单和最易读的解决方案。

关于java - 使用 anyMatch 的流中的空安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51854505/

相关文章:

java - 从 JNDI 获取连接 >15 分钟!

java - Android包名中包含下划线调用JNI函数

java - 为什么整数在 java 中仅对小于 128(默认值)的值充当实习生

Java类继承

javascript - 如何在日历弹出窗口中的个位数月份和日期前插入零?

python - 形成两个字符串列表的笛卡尔积的大多数 Pythonic 方法

string - 从 .dbf 文件中读取编码字符串

r - 展开矩阵列表的维数

r - 对矩阵列表求和,对 NA 的两个约束

Python,列出二维数组中超出范围的索引