Rumah > Java > teks badan

Fluks siri, di mana fluks kedua dicipta dengan cepat dengan nilai terakhir fluks pertama?

王林
Lepaskan: 2024-02-12 12:00:10
ke hadapan
1164 orang telah melayarinya

Editor PHP Shinichi boleh menerangkan konsep ini dengan ringkas dan jelas apabila dia menerangkan "Fluks bercantum, di mana fluks kedua dicipta serta-merta dengan nilai terakhir fluks pertama". Dalam siri fluks, nilai fluks pertama dihantar ke fluks kedua, dan nilai fluks kedua dijana dengan cepat berdasarkan nilai terakhir fluks pertama. Mekanisme ini boleh digunakan untuk melaksanakan pemindahan dan pemprosesan data dinamik, menjadikan aliran program lebih fleksibel dan cekap. Dengan menggunakan fluks bersiri secara rasional, prestasi dan kebolehselenggaraan program boleh dipertingkatkan, dan pengalaman pengguna yang lebih baik boleh disediakan.

Kandungan soalan

Saya syak ini mesti pendua, tetapi saya tersalah google istilah.

Saya mempunyai dua fluks a dan b, tetapi b hanya boleh dibuat menggunakan nilai terakhir a.

Saya ingin mencipta fluks yang pada asasnya adalah gabungan a dan b , tetapi penciptaan b ditangguhkan sehingga kita mendapat nilai terakhir a .

Mungkin, ia kelihatan seperti ini:

fluxC = fluxA.concatWith(lastA -> createFluxB(lastA))
Salin selepas log masuk

Penyelesaian

Saya tidak tahu sama ada terdapat sebarang fungsi dalam perpustakaan yang melakukan perkara ini.

Namun, anda boleh membuat pengendali sedemikian dengan:

  1. Cache nilai terkini trafik input
  2. Buat urutan berikut menggunakan operasi concat standard untuk mendapatkan nilai terakhir daripada aliran cache.

Nota: Ia sepatutnya tidak mempunyai banyak overhed kerana operasi hanya menyimpan satu nilai pada satu masa dan bahagian kedua algoritma harus terus mengambil nilai cache tanpa mencetuskan fluks sumber terbalik.

Berikut ialah contoh pelaksanaan dan ujian:

import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

public class TestConcatLast {

    /**
     * Create a stream that emit all elements from input flux,
     * followed by all items from a flux created by provided function.
     * Input function is triggered using last element of source flux as input.
     *
     * @param source The flux providing elements of the first part of the concatenation.
     * @param createFromLastElement A function that provides the tail of the concatenation from a given element.
     *                              It will be triggered <em>at most once</em> using the last element of input flux.
     * @param errorIfSourceEmpty If true and input stream is empty, the returned flow will trigger an error.
     *                           If false, an empty flux is produced if input is empty.
     */
    public <T> Flux<T> concatLast(Flux<T> source, boolean errorIfSourceEmpty, Function<T, Flux<T>> createFromLastElement) {
        var sourceWithLatestCached = source.cache(1);
        final Mono<T> deferLast = Mono.defer(errorIfSourceEmpty ? sourceWithLatestCached::last : sourceWithLatestCached::next);
        return sourceWithLatestCached.concatWith(
                deferLast.flatMapMany(createFromLastElement)
        );
    }

    @Test
    public void testConcat() {
        var nextExpectedElement = new AtomicInteger(1);
        var elts = Flux.just(1, 2, 3, 4)
                // Check cache works and no element has been fetched back from source
                .doOnNext(i -> {
                    assert nextExpectedElement.compareAndSet(i, i+1);
                });

        var concatenated = concatLast(elts, true, i -> Flux.just(i + 1, i + 2, i + 3));
        StepVerifier.create(concatenated)
                .expectNext(1, 2, 3, 4, 5, 6, 7)
                .verifyComplete();
    }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Fluks siri, di mana fluks kedua dicipta dengan cepat dengan nilai terakhir fluks pertama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan