Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java8获取列表的最后一个非空元素_Java_Lambda_Java 8_Java Stream - Fatal编程技术网

使用Java8获取列表的最后一个非空元素

使用Java8获取列表的最后一个非空元素,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,在Java 7中,如果我想获取列表的最后一个NOTNULL元素,我会这样写: public CustomObject getLastObject(List<CustomObject> list) { for (int index = list.size() - 1; index > 0; index--) { if (list.get(index) != null) { return list.get(index);

在Java 7中,如果我想获取列表的最后一个NOTNULL元素,我会这样写:

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
    ...
}
公共CustomObject getLastObject(列表){ 对于(int index=list.size()-1;索引>0;索引--){ if(list.get(index)!=null){ 返回列表。获取(索引); } } //所有元素都为空时的情况处理 //或者列表为空 ... } 我想通过使用lambdas或java8的另一个特性来编写一个较短的代码。例如,如果我想得到第一个NOTNULL元素,我可以这样写:

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();
}
公共方法(列表){
.....
CustomObject object=getFirstObject(list).OrelGet(/*处理此案例*/);
.....
}
公共可选getFirstObject(列表){
return list.stream().filter(对象->对象!=null).findFirst();
}

也许有人知道如何解决这个问题?

一个可能的解决方案是以相反的顺序迭代列表,并保持第一个非空元素:

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();
}

使用lambdas并不总是一个好主意。给出了@Tunaki的答案,读者使用非lambda方式会更清楚。相关:和@lschuetze,我只是了解lambdas的可能性,我想知道如何使用新的features@assylias返回的流是连续的(根据Javadoc),这就是我链接到其他问题的原因,以表明,例如,使用
reduce
获取最后一个元素。它甚至可以并行执行。约化函数必须是结合的,但不需要是交换的。
public Optional<CustomObject> getLastObject(List<CustomObject> list) {
    return list.stream().filter(Objects::nonNull).reduce((a, b) -> b);
}