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

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

王林
王林ke hadapan
2024-02-12 12:00:101126semak imbas

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))

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();
    }
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam