Seperti yang telah dibahas , perancang API tidak berasumsi bahwa pengembang ingin memperlakukan null
nilai dan nilai yang tidak ada dengan cara yang sama.
Jika Anda masih ingin melakukannya, Anda dapat melakukannya secara eksplisit dengan menerapkan urutan
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
ke sungai. Hasilnya akan menjadi opsional kosong dalam kedua kasus, jika tidak ada elemen pertama atau jika elemen pertama adalah null
. Jadi dalam kasus Anda, Anda dapat menggunakan
String firstString = strings.stream()
.map(Optional::ofNullable).findFirst().flatMap(Function.identity())
.orElse(null);
untuk mendapatkan null
nilai jika elemen pertama tidak ada atau null
.
Jika Anda ingin membedakan kasus-kasus ini, Anda dapat mengabaikan flatMap
langkah berikut:
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"));
Ini tidak jauh berbeda dengan pertanyaan Anda yang diperbarui. Anda hanya perlu mengganti "no such element"
dengan "StringWhenListIsEmpty"
dan "first element is null"
dengan null
. Tetapi jika Anda tidak menyukai persyaratan, Anda dapat mencapainya juga seperti:
String firstString = strings.stream().skip(0)
.map(Optional::ofNullable).findFirst()
.orElseGet(()->Optional.of("StringWhenListIsEmpty"))
.orElse(null);
Sekarang, firstString
akan menjadi null
jika elemen ada tetapi ada null
dan akan terjadi "StringWhenListIsEmpty"
ketika tidak ada elemen.