0

如何检查字符串数组中的元素是否为空?这是我的示例数组:

private static String correct[] = new String[5];
    static {
        correct[1] = "some texT";
        correct[2] = "some texT3";
        correct[4] = "some texT2";
}

我可以分配null给其余元素,但我想找到另一种更好的方法来做到这一点。我找到isEmpty了,但它仅适用于 API 9 及更高版本。

if(correct[0].length() > 0) 给我一个NPE。 if(correct[0] != null还。

4

6 回答 6

6

您是否尝试过“明显”:

if(correct[0] != null && correct[0].length() > 0) {
   //it is not null and it is not empty
}
于 2013-11-05T23:29:34.563 回答
1

只需将其与 比较null,它是某种对象类型的数组的默认值。

if (correct[0] != null && correct[0].length() > 0)

如果&&左侧是 ,则运算符只会评估右侧true,即correct[0]不是null并且不会抛出NullPointerException

于 2013-11-05T23:29:37.033 回答
1

如果您尝试检查特定位置的特定元素是否为空(不仅与 不同null,而且与不同""),所提供的解决方案还不够。

Java 有很多方法可以做到这一点。让我们看看其中的一些:

  1. 您可以将数组转换为List(使用Arrays's asList方法)并通过contains()方法检查条件:

    import java.util.*;
    
    public class Test1 {
    
      private static boolean method1_UsingArrays(String[] array) {
       return Arrays.asList(array).contains(null) 
                || Arrays.asList(array).contains("");
      }
    }
    
  2. 也可以使用Collections's disjoint方法来检查两个集合是否有共同的元素:

    import java.util.*;
    
    public class Test2 {      
    
      private static String[] nullAndEmpty = {"", null};
    
      private static boolean method2_UsingCollectionsDisjoint(String[] array) {
       // disjoint returns true if the two specified collections have no elements in common.
       return !Collections.disjoint( //
         Arrays.asList(array), //
         Arrays.asList(nullAndEmpty) //
       );
      }
    
    }
    
  3. 如果您能够使用Java 8(我最喜欢的选项),则可以使用新的Streams API

    import java.util.stream.*;
    import java.util.*;
    
    public class Test3 {
    
      private static boolean method3_UsingJava8Streams(String[] array) {
       return Stream.of(array).anyMatch(x -> x == null || "".equals(x));
      }
    
    }
    

    trim与其他选项相比,如果您需要每个字符串(或调用其他任何方法) ,这更容易处理String

    Stream.of(array).anyMatch(x -> x == null || "".equals(x.trim()));
    

然后,您可以轻松地调用和测试它们:

public static void main(String[] args) {
  // Ok tests
  String[] ok = {"a", "b", "c"};

  System.out.println("Method 1 (Arrays - contains): " + method1_UsingArrays(ok)); // false
  System.out.println("Method 2 (Disjoint): " + method2_UsingCollectionsDisjoint(ok)); // false
  System.out.println("Method 3 (Java 8 Streams): " + method3_UsingJava8Streams(ok)); // false

  System.out.println("-------------------------------");

  // Nok tests
  String[] nok = {"a", null, "c"};

  System.out.println("Method 1 (Arrays - contains): " + method1_UsingArrays(nok)); // true
  System.out.println("Method 2 (Disjoint): " + method2_UsingCollectionsDisjoint(nok)); // true
  System.out.println("Method 3 (Java 8 Streams): " + method3_UsingJava8Streams(nok)); // true

  // Nok tests
  String[] nok2 = {"a", "", "c"};

  System.out.println("Method 1 (Arrays - contains): " + method1_UsingArrays(nok2)); // true
  System.out.println("Method 2 (Disjoint): " + method2_UsingCollectionsDisjoint(nok2)); // true
  System.out.println("Method 3 (Java 8 Streams): " + method3_UsingJava8Streams(nok2)); // true
}
于 2016-10-10T14:54:54.120 回答
0

好吧,如果您不能使用 isEmpty 尝试使用 Array.Contains(null) 或尝试这个小循环

for(int i = 0;i<=Array.length;i++){
  if(array[i] > 0 && array[i] != null){
     //yay its not null
  }
}
于 2013-11-05T23:47:09.083 回答
0

有类似的版本,其中参数的数量可能更大

if (Arrays.asList(new String[] {productId, productTitle, imageName, productPrice}).contains(null)) {
        return null;
}
于 2017-07-04T03:55:16.897 回答
-1

只使用 isAnyEmpty

org.apache.commons.lang3
StringUtils.isAnyEmpty(final CharSequence... css)
于 2019-09-16T06:25:57.867 回答