[Java] Iterators 인터페이스 (자바의 정석)공부/Java2023. 7. 31. 21:14
Table of Contents
반응형
목차
Interface Iterators<E>
컬렉션에 저장된 요소들을 읽어오는 방법을 표준화
- Java 1.2 버전부터 지원
- 기본적으로 Iterators 변환의 경우 1회용이므로 순차조회 완료 시 재생성 해야함
- ListIterator의 경우 양방향으로 요소 접근이 가능하다 ( Enumeration과 Iterator는 단방향 )
보통 요소가 있는지 확인(hasNext)하고, 요소를 읽는 것이 안전(next)하다
사용 방법
Collection 인터페이스의 iterator() 호출해서 Iterator 구현 객체를 얻어 사용
(1) List
@DisplayName("Collection interface 구현체는 iterator 객체를 얻어서 요소 조회가 가능하다")
@Test
void listIteratorTest() {
// given [1, 2, 3, 4, 5, 6, 7, 8, 9]
List<Integer> list = IntStream.range(1, 10).boxed().collect(Collectors.toList());
// when
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
int i = iterator.next();
if(i % 2 == 0) iterator.remove(); // 짝수 제거
}
// then
assertThat(list).hasSize(5);
assertThat(list).containsExactly(1, 3, 5, 7, 9);
}
(2) Set
@DisplayName("Collection interface 구현한 Set 또한 Iterator 동일하게 적용가능하다")
@Test
void setIteratorTest() {
// given [1, 2, 3, 4, 5, 6, 7, 8, 9]
Set<Integer> data = IntStream.range(1, 10).boxed().collect(Collectors.toCollection(TreeSet::new));
// when
Iterator<Integer> iterator = data.iterator();
while(iterator.hasNext()) {
int i = iterator.next();
if(i % 2 == 1) iterator.remove(); // 홀수 제거
}
// then
assertThat(data).hasSize(4);
assertThat(data).contains(2, 4, 6, 8);
}
(3) Map
- Map의 경우 Collection 인터페이스 구현하지 않으므로 iterator() 가 없다
- keySet(), entrySet(), values()를 사용하여 Iterator객체 호출가능
예시1. keySet()
@Test
void mapIteratorTestByKeySet() {
// given
Map<String, Integer> data = new HashMap<>();
data.put("A", 1);
data.put("B", 2);
data.put("C", 3);
data.put("D", 4);
// when
Iterator<Integer> iterator = data.values().iterator();
while(iterator.hasNext()) {
int next = iterator.next();
if(next % 2 == 0) {
iterator.remove();
}
}
// then
assertThat(data).hasSize(2);
assertThat(data).containsEntry("A", 1).containsEntry("C", 3);
}
예시2. entrySet()
@Test
void mapIteratorTestByEntrySet() {
// given
Map<String, Integer> data = new HashMap<>();
data.put("A", 1);
data.put("B", 2);
data.put("C", 3);
data.put("D", 4);
// when
Iterator<Map.Entry<String, Integer>> iterator = data.entrySet().iterator();
while(iterator.hasNext()) {
Map.Entry<String, Integer> next = iterator.next();
if(data.get(next.getKey()) % 2 == 1) {
iterator.remove();
}
}
// TODO. MAP 에서 key 존재 여부 검사
// then
assertThat(data).hasSize(2);
assertThat(data).containsEntry("B", 2).containsEntry("D", 4);
}
예시3. values()
@Test
void mapIteratorTestByValues() {
// given
Map<String, Integer> data = new HashMap<>();
data.put("A", 1);
data.put("B", 2);
data.put("C", 3);
data.put("D", 4);
// when
Iterator<String> keyIterator = data.keySet().iterator();
while(keyIterator.hasNext()) {
String key = keyIterator.next();
if(data.get(key) % 2 == 1) {
keyIterator.remove();
}
}
// then
assertThat(data).hasSize(2);
assertThat(data).containsEntry("B", 2).containsEntry("D", 4);
}
참고
https://www.youtube.com/watch?v=k5qxJ53RYNc
https://www.geeksforgeeks.org/iterators-in-java/
https://www.baeldung.com/java-iterate-map
반응형
'공부 > Java' 카테고리의 다른 글
[Java] 람다식을 더 짧게 - 메서드 참조 Method Reference (0) | 2023.08.02 |
---|---|
[Java] Optional 클래스 메서드 (자바의 정석) (0) | 2023.08.01 |
[Java] Arrays 클래스 메서드 (자바의 정석) (0) | 2023.07.31 |
[Java] String 클래스 메서드 (자바의 정석) (0) | 2023.07.31 |
[Java] FunctionalInterface와 Lambda Expression (0) | 2023.07.28 |
@leejinwoo1126 :: 천천히 하나씩
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!