Имеется объект
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;
}
}