Như đã thảo luận , các nhà thiết kế API không cho rằng nhà phát triển muốn xử lý null
các giá trị và giá trị vắng mặt theo cùng một cách.
Nếu bạn vẫn muốn làm điều đó, bạn có thể làm điều đó một cách rõ ràng bằng cách áp dụng trình tự
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
đến suối. Kết quả sẽ là một tùy chọn trống trong cả hai trường hợp, nếu không có phần tử đầu tiên hoặc nếu phần tử đầu tiên là null
. Vì vậy, trong trường hợp của bạn, bạn có thể sử dụng
String firstString = strings.stream()
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
.orElse(null);
để nhận null
giá trị nếu phần tử đầu tiên vắng mặt hoặc null
.
Nếu bạn muốn phân biệt giữa các trường hợp này, bạn có thể chỉ cần bỏ qua flatMap
bước:
Optional<String> firstString = strings.stream()
.map(Optional::ofNullable).findFirst().orElse(null);
System.out.println(firstString==null? "no such element":
firstString.orElse("first element is null"));
Điều này không khác nhiều với câu hỏi cập nhật của bạn. Bạn chỉ cần thay thế "no such element"
bằng "StringWhenListIsEmpty"
và "first element is null"
bằng null
. Nhưng nếu bạn không thích điều kiện, bạn có thể đạt được nó cũng như:
String firstString = strings.stream().skip(0)
.map(Optional::ofNullable).findFirst()
.orElseGet(()->Optional.of("StringWhenListIsEmpty"))
.orElse(null);
Bây giờ, firstString
sẽ là null
nếu một phần tử tồn tại nhưng tồn tại null
và nó sẽ là "StringWhenListIsEmpty"
khi không có phần tử nào tồn tại.