Правильно ли я понимаю Java Stream.flatMap? - PullRequest
0 голосов
/ 05 марта 2020

Я пытался ответить на этот вопрос , но не смог, потому что не достаточно хорошо понимаю потоки. Пожалуйста, скажите мне, если мое объяснение правильное или нет.

Мой ответ:

import java.util.Arrays;
import java.util.stream.Stream;

public class Temp {
    public static void main(String [] args){
        String [] input = {"1,2", "3,4", "5"};
        String [] expected = {"1", "2", "3", "4", "5"};

        String [] actual = Stream.of(input)
                .flatMap(s -> Arrays.stream(s.split(",")))
                .toArray(String [] :: new);

        //Testing - Runs only when assertions are enabled for your JVM. Set VM args = -ea for your IDE.
        assert Arrays.equals(actual, expected) : "Actual array does not match expected array!";
    }
}

Мое объяснение:

1 - Возьмите поток элементов (в данном примере Strings) и передайте по одному элементу за один раз flatMap.

ВОПРОС - Это действительно один элемент за раз?

2 - flatMap принимает Function, который преобразует элемент в Stream. В этом примере функция принимает строку («1,2») и преобразует ее в поток из нескольких строк («1», «2»). Поток из нескольких строк генерируется Arrays.stream (массив), который, как мы знаем, берет массив и преобразует его в поток. Этот массив был сгенерирован s.split(","). Все остальные элементы обрабатываются и помещаются в этот один поток.

ВОПРОС - Возвращает ли flatMap один поток для всех элементов входного массива ИЛИ один поток на элемент входного массива?

3 - toArray берет элементы в один поток, полученный из flatMap, и помещает их в один массив.

1 Ответ

0 голосов
/ 05 марта 2020

Предопределенный синтаксис плоской карты:

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)

where, R is the element type of the new stream.
Stream is an interface and T is the type 
of stream elements. mapper is a stateless function 
which is applied to each element and the function
returns the new stream.

, так как flatMap работает внутренне?

Сначала применяется функция, возвращающая другой Optional для объекта внутри (если присутствует) и затем сглаживает результат перед его возвратом, поэтому вам не нужно делать это самостоятельно.

внутренне определил что-то вроде этого

public static <T> Optional<T> flatten(Optional<Optional<T>> optional) {
    return optional.orElse(Optional.empty());
}

Так что в вашем случае

String [] actual = Stream.of(input)
            .flatMap(s -> Arrays.stream(s.split(",")))
            .toArray(String [] :: new);

StreamofInput(input)  - taking input as collection
flatMap: adding map function
s-> Arrays.stream(s.split(","))- taking argument from your arrays individually which is represent by "s" , then converting your array which is splitted by "," and converting into stream.
toArray : converting you result into flat single array because its stateless so it will give you new collection.

для получения дополнительной информации вы можете посетить здесь

...