답변 1
2
안녕하세요. Lego님, 공식 서포터즈 David입니다.
Map의 values를 그대로 반환하게 되면 외부(ItemRepository)에서 Map 내 element를 삭제할 수 있게 됩니다. 그런데 강의와 같이 ArrayList로 한 번 감싸게 되면 Map의 values에 변경을 가할 수 없게 됩니다. 이런 이유로 ArrayList로 한 번 감싼 것입니다.
자세한 동작은 아래 테스트 코드를 참고해 주세요.
public class MapTest {
@Test
void removeElementFromMapValues() {
Map<String, Item> itemMap = new HashMap<>();
itemMap.put("David", new Item("David"));
itemMap.put("Sophie", new Item("Sophie"));
System.out.println("Original Map Values");
itemMap.values().forEach(System.out::println);
Collection<Item> values = itemMap.values();
values.remove(new Item("David"));
System.out.println("Modified Map Values");
itemMap.values().forEach(System.out::println);
}
@Test
void removeElementFromNewArrayListWithMapValues() {
Map<String, Item> itemMap = new HashMap<>();
itemMap.put("David", new Item("David"));
itemMap.put("Sophie", new Item("Sophie"));
System.out.println("Original Map Values");
itemMap.values().forEach(System.out::println);
List<Item> items = new ArrayList<>(itemMap.values());
items.remove(new Item("David"));
System.out.println("ArrayList Items");
items.forEach(System.out::println);
System.out.println("Original Map Values");
itemMap.values().forEach(System.out::println);
}
static class Item {
private String name;
public Item(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Item item = (Item) o;
return Objects.equals(name, item.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public String toString() {
return "Item{" +
"name='" + name + '\'' +
'}';
}
}
}
감사합니다.