Сокращение потока внутренних элементов - PullRequest
2 голосов
/ 20 октября 2019

Я хочу уменьшить поток до потока внутренних элементов исходного потока. Было бы лучше, если бы результатом был также поток. Но если бы это было так, список также работал бы.

Простой пример:

    private class container {
        containerLevel2 element;

        public container(String string) {
            element = new containerLevel2(string);
        }

    }
    private class containerLevel2 {
        String info;

        public containerLevel2(String string) {
            info = string;
        }

    }
public void test() {
        List<container> list = Arrays.asList(new container("green"), new container("yellow"), new container("red"));

> How can i do the following part with Streams? I want something like List<String> result = list.stream()...
        List<String> result = new ArrayList<String>();
        for (container container : list) {
            result.add(container.element.info);
        }

        assertTrue(result.equals(Arrays.asList("green", "yellow", "red")));
    }

Надеюсь, вы понимаете мой вопрос. Извините за плохой английский и спасибо за ваши ответы.

1 Ответ

1 голос
/ 20 октября 2019

Поток - это просто понятие обработки. Вы не должны хранить свои объекты в потоке. Поэтому я бы предпочел коллекции, а не потоки, чтобы хранить эти объекты.

Collection<String> result = list.stream()
    .map(c -> c.element.info)
    .collect(Collectors.toList());

Гораздо лучший подход - добавить новый метод в ваш контейнерный класс, который возвращает информацию об элементе в виде строки, а затем использовать этот метод в вашем лямбда-выражении. Вот как это выглядит.

public String getElementInfo() {
    return element.info;
}

Collection<String> result = list.stream()
    .map(container::getElementInfo)
    .collect(Collectors.toList());

PS Ваши имена классов должны начинаться с заглавной буквы. При именовании элементов API следуйте стандартным соглашениям об именах.

...