In Ihrem Fall können Sie eine flatMap
anstelle von Kombinationen von map
filter
und wieder map
verwenden. Um dies zu tun, ist es besser, eine separate Funktion zum Erstellen eines Streams zu definieren: public private static Stream<Integer> createStream(String e)
, um mehrere Zeilen Code in Lambda-Ausdruck nicht zu haben.
Bitte beachten Sie meine volle Demo Beispiel:
public class Demo{
public static void main(String[] args) {
List<String> list = Arrays.asList("1", "2", "Hi Stack!", "not", "5");
List<Integer> newList = list.stream()
.flatMap(Demo::createStream)
.collect(Collectors.toList());
System.out.println(newList);
}
public static Stream<Integer> createStream(String e) {
Optional<Integer> opt = MyClass.returnsOptional(e);
return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty();
}
}
class MyClass {
public static Optional<Integer> returnsOptional(String e) {
try {
return Optional.of(Integer.valueOf(e));
} catch (NumberFormatException ex) {
return Optional.empty();
}
}
}
bei returnsOptional nicht statisch sein können benötigen Sie „Pfeil“ verwenden Ausdruck anstelle von „Methode Referenz“
Es sieht für mich in Ordnung. Ich bin mir nicht sicher, was dir daran nicht gefällt. – khelwood
Wenn all Ihre Optionals ein Ergebnis haben, ist dies kein Optional mehr. Anstatt ein optionales Element zurückzugeben und zu prüfen, ob isPresent Nullen und Filter zurückgeben kann, ist es einen Schritt kürzer. 'list.stream(). map (e -> myclass.returnsObjectOrNull (e)). filter (Objekte :: nonNull) .collect (Collectors.toList())' – alfasin
.map (o -> o.map (Stream: : of). orElseGet (Stream :: leer)) oder sehen Sie die Antworten hier: http://StackOverflow.com/Questions/22725537/using-Java-8S-optional-with-streamflatmap – hasan