2017-10-12 111 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

相關問題