어느 정도 파악할 수 있도록 하고, Java 언어를 I& # 39 m 나 되는 새로운 방법을 통해 반복할 수 있는 모든 (또는 적어도 비 병리학 수준들과) 한 바뀌엇어요 (또는 아마도 다른 모음) 과 장이점이 (odd) 또는 각.
, Lt, 주어진 < code> List& E&, gt; list< /code>; 객체에는 다음과 같은 방법으로 반복하여, 내가 아는 모든 요소:
// 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 가난한 솔루션으로서의 때문에 실제 구현을 위한 목록을 통해 '의 반복 이 방법을 사용하면 '반복자가' 로 'get' 로 효율형 않을 수도 있습니다. 예를 들어, '모든' 구축 트래버스하도록 링케드리스트 합니다. 요소가 내려받습니다 앞에 i i 번째 요소입니다.
위의 예에서 there& '목록' 에 무리라구 # 39 의 구현 그 place" 절약합니다 "; 향후 이터레이션에 만들기 위해 더 효율적이다.
계산 복잡도 대한 자세한 내용은 내장형 '모음' 구축, 체크아웃하려고 [이 질문] (https://stackoverflow.com/questions/559839/big-o-summary-for-java-collections-framework-implementations).
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
// ...
}
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
// ...
}
list.stream().map(e -> e + 1); // Can apply a transformation function for e
(지도 방법을 Java 에서 8& # 39 의 스트림 API (http://otl. @i_am_zero& # 39 의 답)).
자바 가상 머신 (jvm) 에 콜렉션 클래스를 이트레이블 구현하는 '8' (예를 들어, 모든 'List) 는 이제' 대신 '포리치 방법을 사용할 수 있는 [for 루프 기술서임을] [for 루프는] 그들위에 시연했다. (이것은 또 다른 질문을 좋은 제공하는 비교.)
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).
어떤 경우, 다른 방법이 있습니까?
(브트와, 내 관심 언약보다는 줄기 전혀 싶다는 욕망 성능을 최적화합니다; 그냥 알고 싶은 양식 개발자의 날 수 있습니다.)
이 세 가지 형태의 루프을 거의 동일합니다. 향상된 '는' 루프:
for (E element : list) {
. . .
}
[Java 언어로 사양명세] [1] 은 '에 따르면, 실제로 사용하는 기존의' 는 '명시적 identical 반복자가 수신기마다 루프지 제 3 의 경우 현재 요소 목록 콘텐츠 수정하십시오 제거하여 사용할 수 있습니다 다음 할 경우에만 '' 의 방법을 통해 제거하시겠습니까 반복자가 할 수 있다. You are free to 수정하십시오 어떤 식으로든 함께 인덱스 기반 이터레이션인지 목록. 그러나 요소를 추가하거나 제거할 수 있는 위험 요소 또는 처리 같은 요소 때문에 현재 인덱스화할 우선할 너회의 loop 를 여러 번. 이런 변화가 인덱스화할 루프를 만들 때 제대로 조정해야 합니다.
모든 경우에 '요소' 참조입니다 실제 목록 요소. 어떤 방법을 복제본에 어떤 명단요 이터레이션은 만듭니다. 내부 상태를 변경할 수 있는 '요소' 가 항상 내부 상태를 볼 수 있는 요소가 명단요 해당
특히, 단 두 가지 좁히어 반복할 바뀌엇어요: 이를 통해) 를 사용하여 색인 또는 반복자가. For 루프는 피하기 위해 도입된 표준 Java 5 단지 통사 짧은보기 반복자가 정의하는 명시적으로 지겨움. 사소한 변화를 스타일 모두를 위한 대책마련에 본질적으로 '를 동시에 사용할 수 있습니다' 또는 '동시에' 블록 ',' 할 수 있지만, 그들은 모두 down to the 종기 같은 것입니다. (또는 아니라 두 가지).
편집: @Ix3 점) 으로 설정할 수 있는 요소가 셀명 사용할 수 있습니다 '현재' 리스트리트레이터 바뀌엇어요 반복 될 것입니다. 사용자가 필요로 하는 대신 사용할 수 있는 ['목록 # 리스트리트레이터 ()'] [2] ['목록 # 반복자가 ()'] [3] 초기화하려면 루프 변수 (이를 제대로 인식하지 못하고 있을 것이라고 선언하고 '리스트리트레이터' 대신 '반복자가').
[1]: http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html # jls-14.14.2 [2]: http://docs.oracle.com/javase/7/docs/api/java/util/List.html # listIterator% 28%29 [3]: http://docs.oracle.com/javase/7/docs/api/java/util/List.html # iterator% 28%29
각 종류의 예제에서와 나온 질문:
import java.util.*;
public class ListIterationExample {
public static void main(String []args){
List<Integer> numbers = new ArrayList<Integer>();
// populates list with initial values
for (Integer i : Arrays.asList(0,1,2,3,4,5,6,7))
numbers.add(i);
printList(numbers); // 0,1,2,3,4,5,6,7
// replaces each element with twice its value
for (int index=0; index < numbers.size(); index++) {
numbers.set(index, numbers.get(index)*2);
}
printList(numbers); // 0,2,4,6,8,10,12,14
// does nothing because list is not being changed
for (Integer number : numbers) {
number++; // number = new Integer(number+1);
}
printList(numbers); // 0,2,4,6,8,10,12,14
// same as above -- just different syntax
for (Iterator<Integer> iter = numbers.iterator(); iter.hasNext(); ) {
Integer number = iter.next();
number++;
}
printList(numbers); // 0,2,4,6,8,10,12,14
// ListIterator<?> provides an "add" method to insert elements
// between the current element and the cursor
for (ListIterator<Integer> iter = numbers.listIterator(); iter.hasNext(); ) {
Integer number = iter.next();
iter.add(number+1); // insert a number right before this
}
printList(numbers); // 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
// Iterator<?> provides a "remove" method to delete elements
// between the current element and the cursor
for (Iterator<Integer> iter = numbers.iterator(); iter.hasNext(); ) {
Integer number = iter.next();
if (number % 2 == 0) // if number is even
iter.remove(); // remove it from the collection
}
printList(numbers); // 1,3,5,7,9,11,13,15
// ListIterator<?> provides a "set" method to replace elements
for (ListIterator<Integer> iter = numbers.listIterator(); iter.hasNext(); ) {
Integer number = iter.next();
iter.set(number/2); // divide each element by 2
}
printList(numbers); // 0,1,2,3,4,5,6,7
}
public static void printList(List<Integer> numbers) {
StringBuilder sb = new StringBuilder();
for (Integer number : numbers) {
sb.append(number);
sb.append(",");
}
sb.deleteCharAt(sb.length()-1); // remove trailing comma
System.out.println(sb.toString());
}
}
이제 ' (예를 들어 모든 목록)' 컬렉션을 이트레이블 구현하는 '포리치' 메서드입니다. 메서드입니다 참조 은 8 자바 가상 머신 (jvm) 에 이용할 수 있다.
Arrays.asList(1,2,3,4).forEach(System.out::println);
또한 스트리밍합니다 사용하여 바뀌엇어요 반복할 수 있다.
Arrays.asList(1,2,3,4).stream().forEach(System.out::println);
Arrays.asList(1,2,3,4).stream().forEachOrdered(System.out::println);
'오버' 포리치 '때문에' 포리치 동작은 포지셔닝하십시오 포레아초더드 해야 한다 '' 가 명시적으로 신지애 등 각 요소에 대한 결정적 '에서' 이 스트리밍합니다 포레아초더드 액션을 수행하는 경우가 발생할 경우, order of the 스트리밍합니다 스트리밍합니다 주문하십시오 정해져 있습니다. 그래서 포리치 약간만이라도 주문하십시오 계속 보장할 수는 없습니다.
언제 어디서나 사용할 수 있는 것은 우리가 적절한 평행광 스트리밍합니다 스트리밍합니다 수도 있습니다. 만약 목표가 국한됨 인쇄하려면 관계없이 사용할 수 있습니다 다음 항목을 주문하십시오 평행광 스트리밍합니다 다음과 같습니다.
Arrays.asList(1,2,3,4).parallelStream().forEach(System.out::println);
내가 잘 알고 있지만, 일부 질병 고려해보십시오 don& # 39, t let me 제공하십시오 대안을 외상때문에 볼 수 없던:
List<E> sl= list ;
while( ! sl.empty() ) {
E element= sl.get(0) ;
.....
sl= sl.subList(1,sl.size());
}
또는 그 재귀 버전:
void visit(List<E> list) {
if( list.isEmpty() ) return;
E element= list.get(0) ;
....
visit(list.subList(1,list.size()));
}
또한, 재귀 버전의 클래식 '에 대해 (int i = 0. ":
void visit(List<E> list,int pos) {
if( pos >= list.size() ) return;
E element= list.get(pos) ;
....
visit(list,pos+1);
}
왜냐하면 당신은 내가 그들을 언급하십시오 " 다소 새로운 Java"; 흥미로운 것은, 이 될 수 있다.
포리치 jave 8 일부터 사용할 수 있습니다.
List<String> nameList = new ArrayList<>(
Arrays.asList("USA", "USSR", "UK"));
nameList.forEach((v) -> System.out.println(v));
'8' 에서 '리스트롬포리치 jave 사용할 수 있습니다 ()' '' 반복할 방법을 이용하여 람다 표현식에서는 바뀌엇어요. < br/>;
import java.util.ArrayList;
import java.util.List;
public class TestA {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Apple");
list.add("Orange");
list.add("Banana");
list.forEach(
(name) -> {
System.out.println(name);
}
);
}
}
그래, 많은 대안 나열되었을. 그냥 '고급' 를 사용하여 다음과 같이 기술서임을 가장 쉽고 깨끗한 약간만이라도. 이 '일부' 는 표현식에서는 이트레이블 유형입니다.
for ( FormalParameter : Expression ) Statement
예를 들어, List&, lt, String> 반복할 수 있습니다. 그래서, 침입탐지시스템 (ids), 우리가 쉽게 할 수 있습니다
for (String str : ids) {
// Do something
}
뒤로 대한 검색 콩지름에 다음과 같습니다.
for (ListIterator<SomeClass> iterator = list.listIterator(list.size()); iterator.hasPrevious();) {
SomeClass item = iterator.previous();
...
item.remove(); // For instance.
}
궁금해할까봐 포지셔닝하십시오 트레이터스프레비우시네스 () 는 사용합니다. 또한 emailxtender 쓸 수 있는 내부 루프 (loop) 는 두 개의 자리를 목록 (iterator 같지).
항상 첫 번째와 세 번째 바꿔줄 수 있는 사례를 함께 루프 및 귈이예요 조금 더 코드. 이 사용하면 do-while 사용할 수 있는 장점이 있다.
int i = 0;
do{
E element = list.get(i);
i++;
}
while (i < list.size());
물론 이 같은 누얼포인터렉세페시옹 리스트리시즈 () 가 0 일 경우 발생할 수 있습니다 항상 얻을 수 있기 때문에 한 번 이상 실행됨을. 이 경우 해당 속성 / 방법을 사용하기 전에 수천 요소점 널임 테스트를 통해 해결할 수 있습니다. 그래도 it& # 39 의 많이유 간단해진다는 사용하기 쉽고 for 루프