Я пытался ответить на этот вопрос , но не смог, потому что не достаточно хорошо понимаю потоки. Пожалуйста, скажите мне, если мое объяснение правильное или нет.
Мой ответ:
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
, и помещает их в один массив.