Sobes.tech
Middle+

Čo je metóda rekurzie v Stream?

sobes.tech AI

Odpoveď od AI

Recursion v Stream API priamo nie je podporovaná. Metóda sa nazýva reduce.

Metóda reduce v Stream API vykonáva zhlukovanie prvkov toku do jednej výslednej hodnoty pomocou binárnej operácie.

Existujú tri preťaženia metódy reduce:

  1. Optional<T> reduce(BinaryOperator<T> accumulator): Aplikuje operátor zhlukovania na prvky toku a vracia Optional<T>. Používa sa, keď nie je počiatočná hodnota.

  2. T reduce(T identity, BinaryOperator<T> accumulator): Aplikuje operátor zhlukovania, začínajúc s danou počiatočnou hodnotou (identity). Vráti výslednú hodnotu typu T.

  3. <U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner): Najvšeobecnejšia forma, vhodná pre paralelné toky.

    • identity: Počiatočná hodnota akumulátora.
    • accumulator: Kombinuje prvok toku s akumulátorom.
    • combiner: Kombinuje výsledky paralelných výpočtov.

Príklad použitia:

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class StreamReduceExample {

    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // Príklad 1: Súčet prvkov bez počiatočnej hodnoty
        Optional<Integer> sumOptional = numbers.stream()
                                              .reduce((a, b) -> a + b);
        sumOptional.ifPresent(sum -> System.out.println("Súčet (Optional): " + sum));

        // Príklad 2: Súčet prvkov s počiatočnou hodnotou
        int sumWithIdentity = numbers.stream()
                                     .reduce(0, (a, b) -> a + b);
        System.out.println("Súčet (s identity): " + sumWithIdentity);

        // Príklad 3: Konkatenácia reťazcov s paralelným tokom
        List<String> words = Arrays.asList("Hello", " ", "World", "!");
        String combinedString = words.parallelStream()
                                     .reduce("", // identity
                                             (a, b) -> a + b, // accumulator
                                             (a, b) -> a + b); // combiner
        System.out.println("Zlúčený reťazec: " + combinedString);
    }
}