Comment vérifier si Java 8 Flux de données est vide?

Comment puis-je vérifier si un Stream est vide et renvoie une exception si ce n'est pas, en tant que non-exploitation du terminal?

En gros, je suis à la recherche de quelque chose d'équivalent pour le code ci-dessous, mais sans se matérialiser les flux entre les deux. En particulier, la vérification ne devrait pas se produire avant que le flux est effectivement consommée par un terminal d'opération.

public Stream<Thing> getFilteredThings() {
    Stream<Thing> stream = getThings().stream()
                .filter(Thing::isFoo)
                .filter(Thing::isBar);
    return nonEmptyStream(stream, () -> {
        throw new RuntimeException("No foo bar things available")   
    });
}

private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) {
    List<T> list = stream.collect(Collectors.toList());
    if (list.isEmpty()) list.add(defaultValue.get());
    return list.stream();
}
  • Vous ne pouvez pas avoir votre gâteau et le manger aussi, et tout à fait littéralement donc, dans ce contexte. Vous devez consommer le flux pour savoir si elle est vide. C'est le point de Stream sémantique (la paresse).
  • Il peut être consommé, finalement, à ce stade de la vérification
  • Pour vérifier que le flux n'est pas vide, vous devez tenter de consommer au moins un élément. À ce point, le flux a perdu de sa "virginité" et ne peut pas être consommé à nouveau depuis le début.
InformationsquelleAutor Cephalopod | 2014-10-30