Java 언어에 다소 익숙하지 않기 때문에 목록 (또는 다른 컬렉션)과 각각의 장단점을 반복 할 수있는 모든 방법 (또는 적어도 비 병리학 적 방법)에 익숙해 지려고합니다.
List<E> list
객체가 주어지면 모든 요소를 반복하는 다음과 같은 방법을 알고 있습니다.
기본 for 루프 (물론 동등한 while
/ do while
루프도 있습니다)
// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}
참고 : @amarseillan가 지적한 바와 같이,이 양식을 통해 반복에 대한 빈약 한 선택 List
의 실제 구현하기 때문에의이 get
방법은 사용시 효율적으로하지 않을 수 있습니다 Iterator
. 예를 들어, LinkedList
구현에서는 i 번째 요소를 가져 오려면 i 앞에있는 모든 요소를 통과해야합니다.
위의 예제에서 List
구현이 미래의 반복을보다 효율적으로 만들기 위해 "위치를 저장" 할 방법이 없습니다 . 들어 ArrayList
복잡성 / 비용이 있기 때문에, 실제로 문제가되지 않는 get
시간 상수는 (O (1))을가 반면, LinkedList
그리스트의 크기에 비례한다 (O (N)).
내장 Collections
구현 의 계산 복잡성에 대한 자세한 내용은 이 질문을 확인하십시오 .
향상된 for 루프 ( 이 질문에 잘 설명 되어 있음 )
for (E element : list) {
// 1 - can call methods of element
// ...
}
반복자
for (Iterator<E> iter = list.iterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// ...
}
ListIterator
for (ListIterator<E> iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// 3 - can use iter.add(...) to insert a new element into the list
// between element and iter->next()
// 4 - can use iter.set(...) to replace the current element
// ...
}
기능성 Java
list.stream().map(e -> e + 1); // Can apply a transformation function for e
Iterable.forEach , Stream.forEach , ...
(Java 8 's Stream API의 맵 메소드 (@i_am_zero의 답변 참조)
구현하는 Java 8 콜렉션 클래스 Iterable
(예 : all List
)에는 이제 위에서 설명한 for 루프 명령문forEach
대신 사용할 수 있는 메소드가 있습니다 . (다음은 좋은 비교를 제공하는 또 다른 질문 입니다.)
Arrays.asList(1,2,3,4).forEach(System.out::println);
// 1 - can call methods of an element
// 2 - would need reference to containing object to remove an item
// (TODO: someone please confirm / deny this)
// 3 - functionally separates iteration from the action
// being performed with each item.
Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
// Same capabilities as above plus potentially greater
// utilization of parallelism
// (caution: consequently, order of execution is not guaranteed,
// see [Stream.forEachOrdered][stream-foreach-ordered] for more
// information about this).
다른 방법이 있다면 무엇입니까?
(BTW, 저의 관심은 전혀 성능 을 최적화 하려는 욕구에서 비롯되지 않습니다 . 개발자로서 어떤 형식을 사용할 수 있는지 알고 싶습니다.)
List
인터페이스 에 대한 질문이 구체적으로 있습니까?