เพื่อความสมบูรณ์ ...
บอกว่าคุณจริงๆไม่ต้องการที่จะรักษาMapค่าเป็นLists แต่คุณต้องการที่จะหลีกเลี่ยงการคัดลอกSetลงในListแต่ละครั้ง
ยกตัวอย่างเช่นบางทีคุณอาจจะเรียกฟังก์ชันหนึ่งที่สร้างSetแต่คุณจะผ่านของคุณMap<String, List<String>>ผลไป (ไม่ดีการออกแบบ แต่ออกมาจากมือของคุณ) ฟังก์ชั่นห้องสมุดที่ใช้เวลาเพียงMap<String, List<String>>แม้อย่างใดที่คุณจะรู้ว่าการดำเนินการมันไม่ด้วยLists เท่าเทียมกันบังคับใด ๆCollection(เช่นใด ๆSet) และด้วยเหตุผลบางอย่างคุณจำเป็นต้องหลีกเลี่ยงค่าใช้จ่ายความเร็ว / หน่วยความจำในการคัดลอกแต่ละชุดเป็นรายการ
ในกรณีพิเศษนี้ขึ้นอยู่กับพฤติกรรม (อาจไม่รู้) ฟังก์ชั่นห้องสมุดต้องการออกจากคุณListคุณอาจจะสามารถสร้างList มุมมองในแต่ละชุด โปรดทราบว่านี่ไม่ปลอดภัยโดยเนื้อแท้ (เนื่องจากความต้องการของฟังก์ชั่นห้องสมุดจากแต่ละคนListอาจเปลี่ยนแปลงได้โดยที่คุณไม่ทราบ) ดังนั้นจึงควรเลือกใช้โซลูชันอื่น แต่นี่คือวิธีที่คุณทำ
คุณจะสร้างคลาสที่ใช้Listอินเทอร์เฟซรับSetตัวสร้างและกำหนดให้กับเขตข้อมูลจากนั้นใช้ภายในนั้นSetเพื่อใช้ListAPI (เท่าที่เป็นไปได้และต้องการ)
โปรดทราบว่าพฤติกรรมบางอย่างของรายการคุณจะไม่สามารถเลียนแบบได้โดยไม่ต้องเก็บองค์ประกอบไว้เป็น a Listและพฤติกรรมบางอย่างที่คุณจะเลียนแบบได้เพียงบางส่วนเท่านั้น อีกครั้งคลาสนี้ไม่ใช่การแทนที่ดร็อปดาวน์อย่างปลอดภัยสำหรับLists โดยทั่วไป โดยเฉพาะอย่างยิ่งถ้าคุณรู้ว่ากรณีการใช้งานต้องการการดำเนินการที่เกี่ยวข้องกับดัชนีหรือการตัดทอน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);
...