@n199a
Java

Как с помощью стримов собрать отсортированный объект в Java?

Имеется объект TextItem, который содержит в себе ArrayList. Этот ArrayList содержит в себе множество TextItem и так далее (создавалось с помощью шаблона - Композит).
С помощью стримов я хочу отсортировать вложенные объекты вот так:
component.getChildComponents().stream()
                    .sorted(Comparator.comparingInt(TextComponent::getCountChildElements))
                    .collect( // ???


Только не понимаю, как обратно собрать это в объект типа TextItem.

Вот сам TextItem:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class TextItem implements TextComponent {
    private Iterator<TextComponent> iterator;
    private TypeComponent type;
    private final List<TextComponent> childComponents;

    public TextItem(TypeComponent typeComponent) {
        this.type = typeComponent;
        childComponents = new ArrayList<>();
    }

    @Override
    public void add(TextComponent textComponent) {
        childComponents.add(textComponent);
    }

    @Override
    public void remove(TextComponent textComponent) {
        childComponents.remove(textComponent);
    }

    @Override
    public TypeComponent getComponentType() {
        return this.type;
    }

    @Override
    public TextComponent getChild(int index) {
        return childComponents.get(index);
    }

    @Override
    public int getCountChildElements() {
        return childComponents.size();
    }

    @Override
    public int getCountAllElements() {
        return childComponents.stream()
                .mapToInt(TextComponent::getCountAllElements)
                .sum();
    }

    @Override
    public Iterator<TextComponent> createIterator() {
        if(iterator == null) {
            iterator = new CompositeIterator(childComponents.iterator());
        }

        return iterator;
    }

    @Override
    public List<TextComponent> getChildComponents() {
        return childComponents;
    }

    @Override
    public String toString() {
        StringBuilder msg = new StringBuilder();

        for (TextComponent component : childComponents) {
            msg.append(component.toString());
        }

        return msg.toString();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }

        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        TextItem that = (TextItem) o;

        return type == that.type &&
                childComponents.equals(that.childComponents);
    }

    @Override
    public int hashCode() {
        int result = 17;

        result = 31 * result + (type != null ? type.hashCode() : 0);
        result = 31 * result + childComponents.hashCode();

        return result;
    }
}
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
xez
@xez Куратор тега Java
Senior Junior Roo
var result  =  component.getChildComponents().stream()
                    .sorted(Comparator.comparingInt(TextComponent::getCountChildElements))
                    .collect(Collectors.toList());
component.getChildComponents().clear();
component.getChildComponents().addAll(result);


Лучше добавить еще один метод в TextItem и в него передавать результат (толькол final уберите из ChildComponents).
public void setChildComponents(List<TextComponent> childComponents) {
       this.childComponents = childComponents;
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы