在Java中检查多个字符串的null

在Java中检查多个字符串的null,java,string,null,Java,String,Null,如何检查其中一个字符串是否不为null,只有在其余字符串包含某些内容时才可以 这是一个如何工作的例子,但我觉得应该有更好的方法 if ((string1 != null && !string1.equals("")) && (string2 == null || string2.equals("") || string3 == null || string3.equals(""))) {

如何检查其中一个字符串是否不为null,只有在其余字符串包含某些内容时才可以

这是一个如何工作的例子,但我觉得应该有更好的方法

if ((string1 != null && !string1.equals("")) && 
    (string2 == null || string2.equals("") || string3 == null || string3.equals(""))) {
        // BAD
} else if ((string2 != null && !string2.equals("")) &&
    (string1 == null || string1.equals("") || string3 == null || string3.equals(""))) {
        // BAD
} else if ((string3 != null && !string3.equals("")) &&
    (string1 == null || string1.equals("") || string2 == null || string2.equals(""))) {
        // BAD
}
有没有办法将这种逻辑浓缩成更好的方法

编辑

如果所有字符串都为null,则可以

如果所有字符串都不是null,也可以

如果至少有一个不为null,并且至少有一个为null,则不可以

样本

public static void main(String []args){
     
    String string1 = "1";
    String string2 = "2";
    String string3 = "3";

    String stringA = "";
    String stringB = "";
    String stringC = "";

    String stringQ = "1";
    String stringW = "2";
    String stringY = "";

    // THIS IS FINE         
    System.out.println(isGood(string1, string2, string3));

    // THIS IS FINE         
    System.out.println(isGood(stringA, stringB, stringC));

    // THIS IS NOT FINE         
    System.out.println(isGood(stringQ, stringW, stringY));

}
 
public static boolean isGood (String ... strings) {

    long nullCount = Arrays.stream(strings)
        .filter(s -> s == null || s.isEmpty())
        .count();

    return strings.length == nullCount || nullCount == 0;
}

您可能会从Java中的varargs中受益

if( badStrings( string1, string2, string3 ) ) {
   // bad
}

public boolean badStrings( String ... strings ) {
  for( int i = 0; i < strings.length; i++ ) {
     if( strings[i] != null && !strings[i].isEmpty() ) {
        return false;
     }
   }
   return true;
}
if(坏字符串(字符串1、字符串2、字符串3)){
//坏的
}
公共布尔字符串(字符串…字符串){
for(int i=0;i
只有当至少有一个不为null且至少有一个为null时,这才是不好的

好的,让我们试试这个

public boolean badStrings( String ... strings ) {
  int count = 0;
  for( int i = 0; i < strings.length; i++ ) {
     if( strings[i] != null && !strings[i].isEmpty() ) {
        count++;
     }
   }
   return !(count == 0 || count == strings.length-1)
}
公共布尔字符串(字符串…字符串){
整数计数=0;
for(int i=0;i

代码未经测试。

根据我在评论中对您的要求的理解,这应该是可行的

计算空值(或非空值,无论哪种方式都有效)的数量。然后将其与传递到方法中的字符串数量进行比较。如果计数既不是列表的长度,也不是0,则表示存在非null或空字符串与null或空字符串的混合(表示不好)

公共静态布尔字符串(字符串…字符串){
var nullCount=Arrays.stream(字符串)
.filter(s->s==null | | s.isEmpty())
.count();
返回nullCount0;
}

请注意,数组的
count
返回
long
length
方法将返回
int

字符串。isEmpty()
可能比使用
isEquals(“”
更有帮助。使用数组也可能会有所帮助,您可以在循环中执行此操作。我运行了此数组,它看起来仍然会转到
//bad
,即使所有字符串都为null/空。如果全部为空,则可以。如果不是全部为空,也可以。只有当至少有一个不为空且至少有一个为空时,这才是不好的。感谢您再次尝试。当我使用
string3
empty/null运行此命令时,它仍然无法按预期工作。它确实捕捉到了那些不存在所有变量的情况,所以这很好。投票赞成使用varargs(或者你可以做一个列表)而不是单独的变量。此外,该帖子需要更新,以澄清上述评论中提到的问题。你能不能也把样本输入输出,特别是对你来说独一无二的案例?现在都好了。我更新了这个问题。@markspace所做的与
for
循环的逻辑是相同的,现在只要阅读他的答案,预期的逻辑是相同的。这个场景到底是什么。我刚刚发现string3为空/空?现在一切正常。我更新了问题。
public static boolean badStrings (String ... strings) {

    var nullCount = Arrays.stream(strings)
            .filter(s -> s == null || s.isEmpty())
            .count();

    return nullCount < strings.length && nullCount > 0;
}