Trong trường hợp của bạn, bạn có thể sử dụng một flatMap
thay vì kết hợp của map
filter
và một lần nữa map
. Để làm điều đó, tốt hơn là xác định một hàm riêng biệt để tạo Luồng: public private static Stream<Integer> createStream(String e)
để không có nhiều dòng mã trong biểu thức lambda.
Xin vui lòng xem đầy đủ Demo ví dụ của tôi:
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();
}
}
}
trong trường hợp returnsOptional không thể tĩnh, bạn sẽ cần phải sử dụng "mũi tên" biểu hiện thay vì "phương pháp tham khảo"
Có vẻ tốt với tôi. Tôi không chắc những gì bạn không thích về nó. – khelwood
Nếu tất cả các Optionals của bạn có kết quả thì đây không phải là tùy chọn nữa ... thay vì trả về tùy chọn và kiểm tra nếu isPresent bạn có thể trả về giá trị rỗng và bộ lọc, nó sẽ ngắn hơn một bước. 'list.stream(). map (e -> myclass.returnsObjectOrNull (e)). Bộ lọc (đối tượng :: nonNull) .collect (Collectors.toList())' – alfasin
.map (o -> o.map (Luồng: : of) .orElseGet (Stream :: empty)) hoặc xem câu trả lời ở đây: http://stackoverflow.com/questions/22725537/using-java-8s-optional-with-streamflatmap – hasan