簡體   English   中英

使用Java 8獲取列表的最后一個非null元素

[英]Get last not null element of list by using Java 8

在Java 7中,如果我想獲取列表的最后一個非null元素,我寫這樣的東西:

public CustomObject getLastObject(List<CustomObject> list) {
    for (int index = list.size() - 1; index > 0; index--) {
        if (list.get(index) != null) {
            return list.get(index);
        }
    }
    // handling of case when all elements are null
    // or list is empty
    ...
}

我想通過使用lambdas或Java 8的另一個特性來編寫更短的代碼。例如,如果我想獲得第一個非null元素,我可以這樣寫:

public void someMethod(List<CustomObject> list) {
    .....
    CustomObject object = getFirstObject(list).orElseGet(/*handle this case*/);
    .....
}

public Optional<CustomObject> getFirstObject(List<CustomObject> list) {
    return list.stream().filter(object -> object != null).findFirst();
}

也許有人知道如何解決這個問題?

一種可能的解決方案是以相反的順序迭代List並保留第一個非null元素:

public Optional<CustomObject> getLastObject(List<CustomObject> list) {
    return IntStream.range(0, list.size()).mapToObj(i -> list.get(list.size() - i - 1))
                                          .filter(Objects::nonNull)
                                          .findFirst();
}

請注意,Stream API中沒有findLast方法,因為Stream不一定是有序的或有限的。

另一個解決方案是迭代列表並通過僅保留當前元素來減少它。 這有效地將Stream減少到最后一個元素。

public Optional<CustomObject> getLastObject(List<CustomObject> list) {
    return list.stream().filter(Objects::nonNull).reduce((a, b) -> b);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM