为了完整性...
假设您确实确实希望将Map值视为Lists,但您要避免每次都将其复制Set到中List。
例如,也许您正在调用一个创建的库函数Set,但是您将Map<String, List<String>>结果传递给仅需要的(设计欠佳但不易使用)库函数Map<String, List<String>>,即使您以某种方式知道它对Lists同样适用于任何Collection(因此任何Set)。并且由于某些原因,您需要避免将每个Set复制到列表的速度/内存开销。
在这种特殊情况下,根据库函数需要使用的行为(可能是未知的)List,您可能可以在每个Set 上创建一个List 视图。请注意,这本质上是不安全的(因为每个库函数的要求List可能会在您不知情的情况下发生变化),因此应首选其他解决方案。但是,这是您的处理方式。
您将创建一个实现该List接口的类,Set在构造函数中使用a并将该Set分配给一个字段,然后使用该内部Set实现ListAPI(在可能和期望的范围内)。
请注意,某些List行为如果不将元素存储为List,就无法模仿,而某些行为则只能部分模仿。同样,此类通常不是Lists 的安全替代。特别是,如果您知道用例需要进行与索引相关的操作或MUTATING 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);
...