Stream из Array
Как мне получить поток из Item массива Array<Array<Item>>?
Ответы (3 шт):
Автор решения: Roman
→ Ссылка
val temp = ArrayList<Item>()
val items = Array<Array<Item>>()
override fun getAllItems(): Stream<Item>
{
temp.clear()
items.forEach { it.forEach { temp.add(it) } }
return temp.stream()
}
Автор решения: Podushkoved
→ Ссылка
Может, наведет на нужные мысли. Реализация на Java:
ArrayList<ArrayList<String>> lists = new ArrayList<>();
ArrayList<String> list1 = new ArrayList<>(Arrays.asList("A", "b", "c", "_"));
ArrayList<String> list2 = new ArrayList<>(Arrays.asList("D", "e", "f", ".."));
lists.add(list1);
lists.add(list2);
lists.stream().flatMap(Collection::stream).forEach(System.out::print); // Abc_Def..
Автор решения: IR42
→ Ссылка
items.flatten().stream() - то же самое, что и в вашем ответе. Только что ваше решение, что flatten создают лишнюю коллекцию. Это может быть быстрее на маленьких коллекциях, но на больших уже будет приводить ко всё большим потерям производительности.
Это можно исправить, избежав создание этой лишней коллекции:
Arrays.stream(items).flatMap { Arrays.stream(it) }
Но Stream - это java api, в Котлине есть свой эквивалент - Sequence, с более удобным Api, заточенным под Котлин.
items.asSequence().flatMap { it.asSequence() }