完全を期すために...
あなたがいることを言う本当にやる扱いたいMap
ような値をList
S、しかし、あなたはコピーを避けたいSet
にList
毎回。
たとえば、を作成する1つのライブラリ関数を呼び出しSet
ているが、Map<String, List<String>>
結果が(不十分に設計されているが、手に負えない)ライブラリ関数に渡されMap<String, List<String>>
ている場合、List
sは、any Collection
(したがってany Set
)にも等しく適用されます。そして、何らかの理由で、各セットをリストにコピーする速度/メモリのオーバーヘッドを回避する必要があります。
この非常にニッチなケースでは、ライブラリ関数がから必要とする(多分List
認識できない)動作に応じて、各セットのList
ビューを作成できる場合があります。これは本質的に安全ではないことに注意してください(それぞれからのライブラリ関数の要件は、List
おそらく知らないうちに変更される可能性があるため)ため、別のソリューションをお勧めします。しかし、これはあなたがそれを行う方法です。
List
インターフェースを実装するクラスを作成Set
し、コンストラクターでを受け取り、そのSetをフィールドに割り当て、その内部Set
を使用してList
API を実装します(可能な範囲で、希望どおり)。
要素をとして保存しないと、真似できないListの動作List
や、部分的にしか真似できない動作があることに注意してください。繰り返しますが、このクラスはList
、一般的なの安全なドロップイン代替品ではありません。特に、ユースケースでインデックス関連の操作またはを変更する必要があることがわかっている場合List
、このアプローチは非常に速く南下します。
public class ListViewOfSet<U> implements List<U> {
private final Set<U> wrappedSet;
public ListViewOfSet(Set<U> setToWrap) { this.wrappedSet = setToWrap; }
@Override public int size() { return this.wrappedSet.size(); }
@Override public boolean isEmpty() { return this.wrappedSet.isEmpty(); }
@Override public boolean contains(Object o) { return this.wrappedSet.contains(o); }
@Override public java.util.Iterator<U> iterator() { return this.wrappedSet.iterator(); }
@Override public Object[] toArray() { return this.wrappedSet.toArray(); }
@Override public <T> T[] toArray(T[] ts) { return this.wrappedSet.toArray(ts); }
@Override public boolean add(U e) { return this.wrappedSet.add(e); }
@Override public boolean remove(Object o) { return this.wrappedSet.remove(o); }
@Override public boolean containsAll(Collection<?> clctn) { return this.wrappedSet.containsAll(clctn); }
@Override public boolean addAll(Collection<? extends U> clctn) { return this.wrappedSet.addAll(clctn); }
@Override public boolean addAll(int i, Collection<? extends U> clctn) { throw new UnsupportedOperationException(); }
@Override public boolean removeAll(Collection<?> clctn) { return this.wrappedSet.removeAll(clctn); }
@Override public boolean retainAll(Collection<?> clctn) { return this.wrappedSet.retainAll(clctn); }
@Override public void clear() { this.wrappedSet.clear(); }
@Override public U get(int i) { throw new UnsupportedOperationException(); }
@Override public U set(int i, U e) { throw new UnsupportedOperationException(); }
@Override public void add(int i, U e) { throw new UnsupportedOperationException(); }
@Override public U remove(int i) { throw new UnsupportedOperationException(); }
@Override public int indexOf(Object o) { throw new UnsupportedOperationException(); }
@Override public int lastIndexOf(Object o) { throw new UnsupportedOperationException(); }
@Override public ListIterator<U> listIterator() { throw new UnsupportedOperationException(); }
@Override public ListIterator<U> listIterator(int i) { throw new UnsupportedOperationException(); }
@Override public List<U> subList(int i, int i1) { throw new UnsupportedOperationException(); }
}
...
Set<String> set = getSet(...);
ListViewOfSet<String> listOfNames = new ListViewOfSet<>(set);
...