Rumah  >  Artikel  >  Java  >  Bagaimana untuk Membalikkan Strim dalam Java: Pendekatan Khusus dan Generik?

Bagaimana untuk Membalikkan Strim dalam Java: Pendekatan Khusus dan Generik?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-30 13:18:03600semak imbas

How to Reverse Streams in Java: Specific and Generic Approaches?

Menterbalikkan Strim dalam Java: Pendekatan Generik dan Khusus

Apabila berurusan dengan strim Java, memahami cara membalikkannya boleh menjadi penting. Mari kita mendalami pendekatan khusus dan generik untuk membalikkan strim.

Pendekatan Khusus: Membalikkan Aliran Int

Untuk membalikkan Aliran Int sambil mengekalkan julatnya, anda boleh menggunakan yang berikut pendekatan:

<code class="java">static IntStream revRange(int from, int to) {
    return IntStream.range(from, to)
                    .map(i -> to - i + from - 1);
}</code>

Kaedah ini mengelakkan operasi tinju dan pengisihan yang tidak perlu.

Pendekatan Generik: Membalikkan Arus Mana-mana Jenis

Untuk aliran jenis sewenang-wenangnya, pada masa ini tiada cara "betul" yang dipratentukan untuk membalikkannya. Walau bagaimanapun, berikut ialah dua pilihan biasa:

1. Membalikkan Menggunakan Tatasusunan:

Kaedah ini menyimpan elemen strim dalam tatasusunan dan mendapatkannya dalam susunan terbalik:

<code class="java">@SuppressWarnings("unchecked")
static <T> Stream<T> reverse(Stream<T> input) {
    Object[] temp = input.toArray();
    return (Stream<T>) IntStream.range(0, temp.length)
                                .mapToObj(i -> temp[temp.length - i - 1]);
}</code>

2. Membalikkan Menggunakan Pengumpul:

Kaedah ini menggunakan pengumpul untuk mengumpul elemen dalam senarai terbalik:

<code class="java">Stream<T> input = ... ;
List<T> output =
    input.collect(ArrayList::new,
                  (list, e) -> list.add(0, e),
                  (list1, list2) -> list1.addAll(0, list2));</code>

Pembalikan Cekap Menggunakan ArrayDeque

Disebabkan ketidakcekapan penyalinan O(N^2), kami mengemas kini kod kami yang terdahulu menggunakan ArrayDeque untuk sisipan yang lebih cekap di hadapan:

<code class="java">Deque<String> output =
    input.collect(Collector.of(
        ArrayDeque::new,
        (deq, t) -> deq.addFirst(t),
        (d1, d2) -> { d2.addAll(d1); return d2; }));</code>

Kaedah ini menghasilkan Deque terbalik, yang boleh ditukar dengan mudah kembali ke Strim atau diulang terus.

Atas ialah kandungan terperinci Bagaimana untuk Membalikkan Strim dalam Java: Pendekatan Khusus dan Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn