자바
for문, enhanced for문, Collection.stream().forEach(), Collection.forEach() 차이
모디(modi)
2020. 3. 11. 17:19
- for vs advanced for문
- for에서는 index값을 이용할 수 있고, 배열의 값을 가져와 수정할 수 있다.
- advanced for문 에서는 index 값을 이용할 수 없고, 배열의 값을 가져와 쓸 수만 있고, 수정할 수 없다.
- advanced for의 장단점
- 장점
- 배열의 크기를 알지 못해도 OK
- 수행속도가 조금 더 빠름 (ArrayList는 제외)
- 코드가 짧음
- 단점
- 배열이나 리스트의 값 변경 혹은 추가 NO
- 배열 역순 탐색 NO
- 장점
- (old school) for 문 vs (modern) foreach
- 차이
- old school for문은 외부 iterator, modern forEach는 내부 iterator
- old school for vs modern foreach
- ArrayList 와 같은 경우엔 일반적인 for루프와 forEach()와 속도 면에서 크~~게는 차이가 없다. 그럼에도 일반적인 for루프 보다는 10~20% 느리다.
- 그런데 primitive 타입의 array의 경우엔 일반적인 for루프가 훨씬 더 빠르다.
- forEach()는 JVM 및 라이브러리에서 훨씬 더 많은 작업을 수행하게 되어 유지 측면에서 비효율적이다.
- foreach의 장점이라면?
- 가독성이 좋아진다. (근데 그게 또 항상 그런 것은 아니다...)
- 병렬프로그래밍에 용이
- 차이
- Collection.forEach() vs Collection.stream().forEach()
- Collection.forEach()는 컬렉션의 반복자를 사용한다 (지정된 경우), item의 처리 순서가 정해졌다는 것
- hasNext(), next(), remove() 사용
- 반면에 Collecaion.stream().forEach()는 정해지지 않았다.
- 반복자를 무시하고 목록에서 요소를 하나씩 가져온다.
- 컬렉션 수정
- 반복 중에 element가 추가 혹은 제거 되면 ConcurrentModification 예외가 발생
- Collection.forEach는 추가 혹은 제거 되자 마자 에러가 발생되는데 Collection.stream().forEach()의 경우는 나중에 예외를 발생시킨다.
- Collecion.forEach()는 element를 수정할 수 있는 반면 Collection.stream().forEach()는 수정하면 안됨
- 둘 다 수정할 수는 있으나, stream은 병렬로 수행되기에 예기치 않은 문제가 발생할 수 있다.
- 반복 중에 element가 추가 혹은 제거 되면 ConcurrentModification 예외가 발생
- 결론
- stream이 필요하지 않고 컬렉션을 반복하려는 경우엔 컬렉션에서 직접 forEach()를 사용한다.
- Collection.forEach()는 컬렉션의 반복자를 사용한다 (지정된 경우), item의 처리 순서가 정해졌다는 것
- 자바 8에서 형변환 하는 방법
old school for 문
public List<Fruit> appleToFruit(String name){
List<String> appleNames = Arrays.asList(name.split(","));
List<Fruit> fruitList = new ArrayList<>();
for(int i=0; i<appleNames.size(); i++) {
fruitList.add(new Fruit(appleNames.get(i)));
}
return fruitList;
}
public static List<Fruit> appleToFruit(String apple){
List<String> appleNames = Arrays.asList(apple.split(","));
return appleNames.stream().map(v -> new Car(v)).collect(Collectors.toList());
}
참고