Iterator 그리고 Stream.
Iterator 하고 스트림은 collection 안에 있는 element 들을 건들지 않고 (한번) 가져와서 사용 할수 있게 하며, 유용한 API 들 제공함.
1. Iterator (JAVA 6)
Iterator 는 object, 입니다 collections(ArrayList & HashSet) 안 을 loop(루프) 할수 있게 도와줍니다.
"iterator" 라고 불리는 이유는 이것이 "iterating"("반복하다") 하기 때문입니다.
ArrayList<String> cars = new ArrayList<String>();
cars.add("Volvo");
cars.add("BMW");
cars.add("Ford");
cars.add("Mazda");
// Get the iterator
Iterator<String> it = cars.iterator();
it.next(); , 현제 it 가 가르키고 있는것 다음것을 it 로 함.
.remote 는 현제 iterator 가 가르키고 있는것을 삭제.
System.out.println(it.next());// 첫 번째거 나옴
System.out.println(it.next());// 두 번째거 나옴
System.out.println(it.next());// 세 번째거 나옴
System.out.println(it.next());// 네 번째거 나옴
System.out.println(it.hasNext()); // 뒤에 더 있는지 확인 true:false
it.remove(); // 현제 it 가 가르키는것 삭제
System.out.println(cars); // [Volvo, BMW, Ford]
2. Stream (JAVA 8)
스트림 받아오기
list.stream()
Filter: 새로운 스트림을 반환하여 원본의 일부 요소를 포함합니다. 이는 어떤 요소가 새로운 스트림에 반환되어야 하는지 계산하기 위한 프레디케이트를 허용하며 나머지는 제거합니다. 명령형 코드에서는 요소가 조건을 만족하는 경우 어떻게 처리해야 하는지를 지정하기 위해 조건 로직을 사용합니다. 함수형 스타일에서는 조건문을 신경쓰지 않고 스트림을 필터링하고 필요한 값에만 작업을 수행합니다. (조건에 맞는것을 반환)
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 3, 5,7,9,11));
list.stream().filter(e -> e%3==0).forEach(System.out::println); // 3 , 9
Map: 스트림 요소를 다른 값으로 변환합니다. 각 요소에 적용할 함수를 허용하고 해당 함수가 생성한 값을 포함하는 새로운 스트림을 반환합니다. 이것이 Java 스트리밍 API의 핵심입니다. Map을 사용하면 스트림 내의 데이터에 계산을 수행할 수 있습니다.(모든 요소를 가공해서 반환)
ArrayList<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 3, 5,7,9,11));
List<Integer> newlist = list.stream().map(e -> e*2).toList(); // 모든갑 x 2
newlist.stream().forEach(e-> System.out.println(e));
// 2 6 10 14 18 22
Reduce: (가끔 폴드라고도 함) 스트림을 단일 요소로 축소합니다. 스트림에서 모든 정수 값의 합을 구하려면 reduce 함수를 사용해야 합니다. 스트림에서 최대값을 찾으려면 reduce가 도움이 됩니다.
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> sum = numbers.reduce((x, y) -> x + y);
sum.ifPresent(s -> System.out.println("sum: " + s));
Collect: 이것은 스트림 세계에서 벗어나 구체적인 값 컬렉션을 얻는 방법입니다. 위 예제에서는 리스트와 같은 값 컬렉션을 얻기 위한 방법입니다.
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 3, 5,7,9,11));
List<Integer> listresut = list.stream().collect(Collectors.toList());
Set<Integer> setresult = list.stream().collect(Collectors.toSet());
스트림 결과 만들기
(마지막에 넣어주면됨)
.toList()