2017-10-12 114 views
1

有没有什么好的方法来获得第一个非空字符串数组元素的索引?是的,你可以写如何获取第一个非空数组元素的索引?

int index; 
for (int i = 0; i < arr.length; i++) { 
    if (arr[i] != null) { 
     index = i; 
     break; 
    } 
} 

但也许有可能以更美丽的方式做到这一点?例如,您可以使用ObjectUtils.firstNonNull方法获取数组的第一个非空元素,或许有类似于获取索引的东西?

回答

7

一个技巧是创建索引的流,然后找到一个指向非空值的第一个:在Java版本

int index = 
    IntStream.range(0, arr.length) 
      .filter(i -> arr[i] != null) 
      .findFirst() 
      .orElse(-1 /* Or some other default */); 
3

如果您使用的是Java 9,则有一种称为takeWhile()的方法。你可以像这样在你的数组中使用它。

long index = Arrays.stream(yourArray).takeWhile(Objects::isNull).count(); 

编辑

在情况下,没有非空元素索引将等于所述阵列的长度。

您可以对它进行检查。

if(index == array.length) { 
    index = -1; 
} 
+0

但是,这可能会产生意外的行为,如果有_no_非空元素...... –

+0

@tobias_k,嗯,你是对的,如果没有非空的元素,它将返回数组的长度。感谢您的评论。我将编辑它 –

1

例如,像早于8 :

static final Object ANY_NOT_NULL = new Object() 
{ 
    @Override 
    public boolean equals(final Object obj) 
    { 
     return obj != null; 
    } 
}; 

public static int firstIndexOfNotNull(Object... values) 
{ 
    return Arrays.asList(values).indexOf(ANY_NOT_NULL); 
} 
+0

这打破了“等于”交换性质的假设。如果'Arrays.asList'碰巧传递给'indexOf'的对象(就像OpenJDK 8似乎那样),那么它就会工作,但对于JDK来说反过来实现它是完全可以的,在这种情况下,你的解决方案将不起作用 – Mureinik

+0

Javadoc对'indexOf'的评论清楚地表明: '返回此列表中指定元素第一次出现的索引,如果此列表不包含元素,则返回-1。更正式地说,如果没有这样的索引,返回最低索引i,使得(o == null?get(i)== null:o.equals(get(i)))或-1。 – yegodm

相关问题