List<Bean> one //blah;
List<Bean> two //blah;
List<Bean> three //blah;
List<Bean> myCombined = Lists.newArrayList();
myCombined.addAll(one);
myCombined.addAll(two);
myCombined.addAll(three);
то, если я удалю из основного списка, будет ли он удален из объединенного списка?
one.remove(myBean)
one.contains(myBean); //false
myCombined.contains(myBean); //true or false ?
Лучший способ добиться этого, если нет?
addAll
копирует элементы из исходного списка в список адресатов.
Поэтому, удаляя элемент из one
это не повлияет на myCombined
.
Чтобы просмотреть список, вы можете использовать Guava Iterables.concat(...)
:
Iterable<Bean> combinedView = Iterables.concat(one, two, three);
Iterables.contains(combinedView, myBean); // true
one.remove(myBean);
Iterables.contains(combinedView, myBean); // false
Вы также можете использовать Java Stream:
Stream<Bean> combined = Stream.of(one, two, three)
.reduce(Stream.empty(), Stream::concat)
.map(identity());
Stream
для компиляции.
myCombined.contains(myBean);
вернет true, поскольку Список является новым объектом и не относится к другому.
Лучший способ сделать это - создать метод, который очищает каждый список
public void removeObject(Bean b)
{
this.one.remove(myBean);
this.myCombined.remove(myBean);
}
Затем просто вызовите removeObject(myBean)
.
Посмотрите пример метода addAll
(из ArrayList
)
public boolean addAll(Collection<? extends E> c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacityInternal(size + numNew); // Increments modCount
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}
Вы можете ясно видеть, что он создает копию.
Нет, если вы удалите элемент из одного из базовых списков, он не будет "исчезать" из объединенного списка, так как объединенный список - это новый список, содержащий новые ссылки на элементы.
Чтобы выполнить то, что вам нужно, вам нужно просмотреть список по базовым спискам. Библиотека Google Guava предлагает это с помощью метода Iterables.concat()
:
Iterable<Bean> combined = Iterables.concat(one, two, three);
Обратите внимание, что возвращаемый Iterable
не является List
, а просто Iterable
.
Фактически, оба списка будут иметь ссылки на один и тот же объект. Так что изменение от one
изменится на myCombined
.
Удаление из one
будет просто удалить ссылку в one
, но myCombined
будет отслеживать свою собственную ссылку.
Iterables.concat
которая возвращаетList
?