Stream::flatMap ialah alat berkuasa dalam Java 8 untuk menggabungkan berbilang strim ke dalam satu strim. Walau bagaimanapun, ia memerlukan mengembalikan strim, yang boleh menimbulkan masalah apabila berurusan dengan Pilihan.
Pertimbangkan situasi di mana kita mempunyai Senarai
Pendekatan naif menggunakan Stream::flatMap dan Optional::findFirst akan gagal, kerana Pilihan tidak menyediakan aliran() kaedah:
<code class="java">things.stream().flatMap(this::resolve).findFirst(); // Error!</code>
Java 16 dan Kemudian
Java 16 memperkenalkan Stream.mapMulti, yang membenarkan pemetaan Pilihan kepada aliran elemen bukan kosongnya:
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .<Other>mapMulti(Optional::ifPresent) .findFirst();</code>
Java 9
Java 9 ditambah Optional.stream, yang secara langsung mengembalikan aliran nilai Pilihan yang tidak kosong:
<code class="java">Optional<Other> result = things.stream() .map(this::resolve) .flatMap(Optional::stream) .findFirst();</code>
Java 8
Untuk Java 8, kita boleh menggunakan fungsi pembantu untuk menukar Pilihan kepada strim:
<code class="java">static <T> Stream<T> streamopt(Optional<T> opt) { if (opt.isPresent()) return Stream.of(opt.get()); else return Stream.empty(); }</code>
Menggunakan fungsi pembantu ini, penyelesaiannya menjadi:
<code class="java">Optional<Other> result = things.stream() .flatMap(t -> streamopt(resolve(t))) .findFirst();</code>
Atas ialah kandungan terperinci Cara Meratakan Pilihan menjadi Strim di Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!