Stream<String> stream = list.stream();
stream.forEach( item -> //아이템 처리);
Stream은 lterator와 비슷한 반복자지만, 다음과 같은 차이점을 가지고 있다.
- 내부 반복자 이므로 처리 속도가 빠르고 병렬 처리에 효율적이다.
- 람다식으로 다양한 요소 처리를 정의할 수 있다.
- 중간 처리와 최종 처리를 수행하도록 파이프라인을 형성할 수 있다.


java.util.stream패키지에는 스트림 인터페이스들이 있다. BaseStream인터페이스를 부모로 한 자식 인터페이스들은 다음과 같은 상속 관계이다.

java.util.Collection인터페이스는 스트림과 parallelStream() 메소드를 가지고 있기 때문에 자식 인터페이스인 List, Set 인터페이스를 구현한 모든 컬렉션에서 객체 스트림을 얻을 수 있다. IntStream, LongStream의 정적 메소드인range(),rangeClosed()메소드를 이용하면 특정 범위의 정수 스트림음 얻을 수 있다. 첫 번째 매개값은 시작수이고 두번째 매개 값은 끝 수인데, 끝 수를 포함하지 않으면 range() 포함하면 rangeClosed()java.nio.file.Files의 line()메소드를 이용하면 텍스트 파일의 행 단위 스트림을 얻을 수 있다. 이는 텍스트 파일에서 한 행씩 읽고 처리할 때 유용하게 사용할 수 있다.distinct()``filter()가 있다.
distinct()메소드는 요소의 중복을 제거한다. 객체 스트림일 경우 equals()의 리턴값이 true이면 동일한 요소로 판단한다.
filter()메소드는 매개값으로 주어진 predicate가 true를 리턴하는 요소만 필터링한다.

매핑은 스트림의 요소를 다른 요소로 변환하는 중간 처리 기능이다.


요소를 복수 개의 요소로 변환

flatMap()메소드의 종류

정렬은 요소를 오름차순 또는 내림차순으로 정렬하는 중간 처리 기능이다.

Comparable 구현 객체의 정렬
Comparable을 구현하고 있어야만 sorted() 메소드를 사용하여 정렬할 수 있다.
Comparator를 이용한 정렬
peek()``forEach()가 있다.




ex)isPresent()메소드 예시
OptionalDouble optional = stream
.average();
if(optional.isPresent()) {
System.out.println("평균: " + optional.getAsDouble());
} else {
System.out.println(" 평균: 0.0");

List<Student> maleList = totalList.stream()
.filter(s- >s.getSex().equals("남"))
.collect(Collectors.toList());
Map<String, Interger> map = totalList.stream()
.collect(
Collectors.toMap(
s -> s.getName(),
s -> s.getScore()
)
);
Map<String, List<Student>> map = totalList.stream()
.collect(
Collectors.groupingBy(s ->s.getSex())
);



Stream<Integer> stream = scores.parallestream();
startTime = System.nanoTime();
avg = stream
.mapToInt(i -> i.intValue())
.average()
.getAsDouble();
endTime = System.nanoTime();
time = endTime - StartTime;
위와 같은 병렬 스트립 코드는 일반 스트림 코드보다 런타임이 짧음을 코드의 결과로 알 수 있었다.
스터디 링크와 코드 링크 모두 에러가 뜹니다 ㅠㅠㅠㅠㅠ 그래도 좋은 글 감사합니다~~~ 항상 보고 배우고 있습니다!!