W twoim przypadku możesz użyć jednego flatMap
zamiast kombinacji map
filter
i ponownie map
. Aby to zrobić, lepiej jest zdefiniować oddzielną funkcję tworzenia strumienia: public private static Stream<Integer> createStream(String e)
, aby nie mieć kilku linii kodu w wyrażeniu lambda.
proszę zobaczyć moje pełne przykład Demo:
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();
}
}
}
w przypadku returnsOptional nie mogą być statyczne trzeba będzie użyć „strzałka” wyraz zamiast „metodą odniesienia”
To wygląda dobrze do mnie. Nie jestem pewien, co ci się nie podoba. – khelwood
Jeśli wszystkie opcje mają wynik, to nie jest już opcją ... zamiast zwracać opcjonalne i sprawdzać, czy isPresent można zwrócić wartości null i filtr, będzie o jeden krok krótszy. 'list.stream(). map (e -> myclass.returnsObjectOrNull (e)). filter (Objects :: non null) .collect (Collectors.toList())' – alfasin
.map (o -> o.map (Stream: : of) .orElseGet (Stream :: empty)) lub zobacz odpowiedzi tutaj: http://stackoverflow.com/questions/22725537/using-java-8s-optional-with-streamflatmap – hasan