java - Объединить сбор списка с одним значением с использованием потоков




list java-8 (2)

Вы можете использовать Stream.concat чтобы объединить Stream.of одного значения и поток других значений:

List<Integer> result = list.stream()
        .flatMap(x -> Stream.concat(Stream.of(x.value), x.values.stream()))
        .collect(Collectors.toList());

У меня есть следующие данные:

 CustomClass first = new CustomClass(1, Arrays.asList(1, 2, 3));
 CustomClass second  = new CustomClass(5, Arrays.asList(6,7,8));
 List<CustomClass> list = Arrays.asList(first, second);

Теперь я хочу собрать эти данные в список, который содержит значение из CustomClass и значения из его списка.

Я хочу получить это: 1, 1, 2, 3, 5, 6, 7, 8

Это то, что я реализовал:

list.stream().forEach(item -> {
        result.add(item.value);
        item.values.stream().forEach(seconditem -> result.add(seconditem));
    });

Я знаю, что есть метод сбора для потока, но я не понимаю, как использовать его для сбора как одного значения, так и списка значений из одного класса.


Для создания наборов вы можете использовать метод фабрики varargs вместо инициализации с двойной привязкой:

public static Set<T> setOf(T ... elements) {
    return new HashSet<T>(Arrays.asList(elements));
}

В библиотеке коллекций Google есть много удобных методов, таких как это, а также множество других полезных функций.

Что касается безвестности идиомы, я встречаюсь с ней и постоянно использую ее в производственном коде. Меня больше беспокоят программисты, которые путаются, когда идиома разрешается писать производственный код.





java list java-8