如果使用Stream.allMatch(),如何为空列表返回false?

jav*_*ava 2 java java-stream

我想对Java流使用一条语句。

我要筛选所有要求为“ true”的Servicework对象,然后检查所有Servicework对象的状态是否为“完成”。

但是,如果serviceworkList ist为空,则变量“ validate”为false。我知道allMatch的规范,即如果list为空,则返回true。

关于如何重建流的任何建议,如果list ist为空,我将得到false?

public class Service{

    List<ServiceWork> serviceWorkList = new ArrayList<>();


    boolean validate = serviceWorkList
        .stream()
        .filter(ServiceWork::isRequirement)
        .allMatch(a -> a.getStatus() == Status.DONE);

}
Run Code Online (Sandbox Code Playgroud)

class ServiceWork {

    private Status status;
    private boolean isRequirement;

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public boolean isRequirement() {
        return isRequirement;
    }

    public void setRequirement(boolean requirement) {
        isRequirement = requirement;
    }
}
Run Code Online (Sandbox Code Playgroud)

enum Status {
    DONE, NOT_DONE
}
Run Code Online (Sandbox Code Playgroud)

Lin*_*ica 8

只需添加其他检查,以确保列表不为空:

boolean validate = !serviceWorkList.isEmpty() && serviceWorkList
    .stream()
    .filter(ServiceWork::isRequirement)
    .allMatch(a -> a.getStatus() == Status.DONE);
Run Code Online (Sandbox Code Playgroud)

发表评论后,您可以使用以下命令:

Set<Status> status = serviceWorkList
    .stream()
    .filter(ServiceWork::isRequirement)
    .map(ServiceWork::getStatus())
    .collect(Collectors.toCollection(() -> EnumSet.noneOf(Status.class)));

boolean validate = status.remove(Status.DONE) == Status.DONE && status.isEmpty();
Run Code Online (Sandbox Code Playgroud)

它首先将所有状态收集到中EnumSet,然后Status.DONE从集合中删除,如果集合为空,则每个元素都具有getStatus() == Status.DONE

但是,这消除了短路,因此serviceWorkerList即使遇到了Status其他情况,它仍然会迭代。Status.DONE