Sizin durumunuzda map
filter
ve map
yeniden birleştirmeler yerine bir flatMap
kullanabilirsiniz. Bunu yapmak için, Stream: public private static Stream<Integer> createStream(String e)
, lambda ifadesinde birçok kod satırının olmaması için ayrı bir işlev tanımlamak daha iyidir. dava returnsOptional içinde
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();
}
}
}
Kullanmak yerine "yöntemi referansı"
O bana iyi göründü ifadesini "ok" gerekecektir statik olamaz:
benim tam Demo örneğine bakın. Ne sevmediğinden emin değilim. – khelwood
Tüm Optional'larınızın bir sonucu varsa, bu isteğe bağlı değildir. İsteğe bağlı olarak dönmek ve isPresent olup olmadığını kontrol etmek için boş değerlere ve filtrelere geri dönmek yerine bir adım daha kısa olacaktır. map.stream(). map (e -> myclass.returnsObjectOrNull (e)) filter (Nesneler :: nonNull) .collect (Collectors.toList()) ' – alfasin
.map (o -> o.map (Akış: : of) .orElseGet (Stream :: empty)) veya burada cevapları bakın: http://stackoverflow.com/questions/22725537/using-java-8s-optional-with-streamflatmap – hasan