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

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

Mary-Kate Olsen
Lepaskan: 2024-10-30 13:18:03
asal
725 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan