• 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은 병렬로 수행되기에 예기치 않은 문제가 발생할 수 있다. 
    • 결론
      • stream이 필요하지 않고 컬렉션을 반복하려는 경우엔 컬렉션에서 직접 forEach()를 사용한다.
  • 자바 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());
}

 

참고

불러오는 중입니다...

+ Recent posts