2019. 10. 8. 19:19ㆍ카테고리 없음
1절. 스트림 소개
스트림은 반복자
- 컬렉션(배열 포함)의 요소를 하나씩 참조해서 람다식으로 처리할 수 있는 반복자이다.
- 자바 7이전 코드
List<String> list = Arrays.asList("학생1", "학생2","학생3"); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { String name = iterator.next(); System.out.println(name); }
- 자바 8 이후 코드
List<String> list =Arrays.asList("학생1","학생2","학생3"); Stream<String> stream = list.stream(); stream.forEach(name -> System.out.println(name));
- 자바 7이전 코드
스트림 특징
람다식으로 요소 처리 코드를 제공한다.
매개값으로 람다식 또는 메소드 참조를 대입할 수 있다.
public static void main(String[] args) { List<Student> list = Arrays.asList( new Student("학생a", 90), new Student("학생b", 92) ); Stream<Student> studentStream = list.stream(); studentStream.forEach(s->{ String name = s.getName(); int score = s.getScore(); System.out.println(name + "-" + score); }); }
내부 반복자를 사용하므로 병렬 처리가 쉽다.
외부 반복자
개발자가 코드로 직접 컬렉션 요소를 반복해서 요청하고 가져오는 코드 패턴
ex) next()..내부 반복자
컬렉션 내부에서 요소들을 반복시키고 개발자는 요소당 처리해야할 코드만 제공하는 코드 패턴내부 반복자의 이점
- 개발자는 요소 처리 코드에만 집중 ( 람다식에는 next()라는 값을 가져오는 코드가 없다.)
- 멀티 코어 CPU를 최대한 활용하기 위해 요소들을 분배시켜 병렬 처리 작업을 할 수 있다.
병렬 (parallel) 처리
스트림은 중간 처리와 최종 처리를 할 수 있다.
- 중간 처리 : 요소들의 매핑, 필터링, 정렬
- 최종 처리 : 반복, 카운트, 평균, 총합
🔽 예시 ) 중간 처리 : 학생의 개별 점수를 뽑아낸다. (Student 객체를 점수로 매핑)최종 처리 : 개별 점수의 평균값을 산출한다.(평균)
2절. 스트림의 종류
스트림이 포함된 패키지
BaseStream : 모든 스트림에서 사용할 수 있는 공통 메소들이 정의되어 있을 뿐 코드에서 직접적으로 사용되지는 않는다.
- Stream
- IntStream
- LongStream
- DoubleStream
스트림 구현 객체를 얻는 방법
java.util.Collection.stream() / 소스 : 컬렉션
java.util.Collection.parallelStream
IntStream.range() 끝값을 포함하지 않는다. (1,5) 1,2,3,4 /int 범위
IntStream.rangeClosed(1,5) 1,2,3,4,5
Files.find(Path, int, BiPredicate,FileVisitOption)//BiPredicate : 조건식..
Files.list(Path) -> 조건 없이 파일의 경로
FIles.lines(Path,Charset) //Charset 문자의 종류
BufferedReader.lines() //한줄을이
Random.doubles(..) -> 리턴타입 : DoubleStream
컬렉션으로부터 스트림 얻기
List<Student> studentList = Arrays.asList(
new Student("A학생",10), //저장한 것이 Student 객체이기 때문에 <Student>
new Student("B학생",20),
new Student("C학생",30)
);
Stream<Student> stream = studentList.stream();
stream.forEach(s -> System.out.println(s.getName()));//3번 실행
배열로부터 스트림 얻기
String[] strArray = {"학생A","학생B","학생C"};
Stream<String> strStream = Arrays.stream(strArray);
strStream.forEach(s -> System.out.println(s));
Int[] intArray = {1,2,3,4,5};
IntStream intStream = Arrays.stream(intArray);
intStrema.forEach(a - >System.out.println(a));
숫자 범위로부터 스트림얻기
IntStream stream = IntStream.rangeClosed(1, 100);//1부터 100까지
stream.forEach(a -> sum += a);
System.out.println("총합: " + sum);
//s -> System.out.println(s)
//읽기 향상을 위해 BufferedReader