-
스트림(1) - 스트림이란,리소스로 스트림 얻기언어/JAVA 2023. 7. 14. 13:50
1. 스트림이란?
- java8부터 추가된 컬렉션 및 배열의 요소를 반복 처리하기 위해 등장.
- 요소들이 하나씩 흘러가면서 처리된다는 의미를 가지고 있다.
- 스티림을 통해 List를 반복처리하면 다음과 같다.
Stream<String> stream = list.stream(); stream.forEach(item -> //item처리); //StreamEx.ja public class StreamExample{ public static void main(String[] args){ Set<String> set = new HashSet<>(); set.add("홍길동"); set.add("신용권"); set.add("김자바"); Stream<String> stream = set.stream(); stream.forEach(System.out.println(name)); } }
- Stream은 Iterator과 비슷한 반복자지만, 다음과 같은 차이가 있다.
1) 내부 반복자이므로 처리 속도가 빠르고 병렬 처리에 효율적이다.
2) 람다식으로 다양한 요소 처리를 정의할 수 있다.
3) 중간 처리와 최종 처리를 수행하도록 파이프 라인을 형성할 수 있다.
2. 내부반복자
-for문과 Iterator은 컬렉션 요소를 컬렉션 바깥쪽으로 반복해서 처리한다. (외부반복자)
- 스트림은 요소 처리 방법을 컬렉션 내부로 주입시켜 요소를 반복한다.
- 외부 반복자의 경우 컬렉션 요소를 외부로 가져오는 코드 + 처리 코드를 모두 가지고 있어야한다.
- 내부반복자는 람다식등을 가지고 컬렉션 내부에서 요소를 반복처리한다.
- 내부반복자는 하나씩 순차적으로 처리해야하는 외부반복자와 다르게, 내부적으로 사용되므로 병렬처리에 용이하다.
//병렬처리 스트림 public class ParallelStream{ public static void main(String[] args){ List<String> list = new ArrayList<>(); list.add("홍길동"); list.add("신용권"); list.add("김자바"); list.add("람다식"); list.add("병렬처리"); Stream<String> parallelStream = list.parallelStrema(); parallelStream.forEach(name -> { System.out.println(name+ ":" + Thread.currentThread().getName()); }); } }
3. 중간처리와 최종처리
- 스트림은 하나 이상 연결될 수 있다.
- 하나 이상의 스트림이 연결되어 있는 것을 스트림 파이프라인 이라고 한다.
- 중간 스트림들은 최종 처리를 위한 필터링,요소변환(매핑),정렬 등을 수행
- 최종 처리는 중간 스트림의 결과를 사용하여 카운트,총합,평균 등을 구하는 작업을 진행한다.
//Student 스트림 Stream<Student> studentStream = list.stream(); //score 스트림 (student에서 int값 빼기) IntStream scoreStream = studentStream.mapTOInt(student -> student.getScore()); //평균계산 double avg = scoreStream.average().getAsDouble(); //이를 파이프라인으로 변경하면 double avg = list.stream().mapToint(student -> student.getScore()).avarage().getAsDouble();
- 파이프라인을 만들때 주의사항은 최종처리가 항상 맨 끝에 있어야한다.
- 최종처리가 없으면, 중간처리는 작동하지 않는다.
4. 리소스로부터 스트림 얻기
- 주로 이미 만들어진 컬렉션과 배열등을 통해 스트림을 얻을 수 있다.
- 아래와 같은 방법으로 스트림 구현객체를 얻을 수 도 있다.
//컬렉션으로부터 스트림 얻기 Stream<Object> stream = list.stream(); //배열로부터 스트림 얻기 String[] strArray ={"d","d","d"}; Stream<String> strStream = Arrays.stream(strArray); //숫자 범위로부터 스트림 얻기 IntStream stream = IntStream.rangeClosed(1,100); //파일로부터 스트림 얻기 Stream<String> stream = Files.lines(path,Charset.defaultCharset());
참고자료:
이것이 자바다
'언어 > JAVA' 카테고리의 다른 글
Java - File클래스 (0) 2023.07.24 스트림(2) - 중간 처리 (0) 2023.07.14 - JavaNextStep - 숫자야구게임(1) - 단위테스트 (0) 2023.07.10 -JavaNextStep (1) - Junit (0) 2023.07.10 중첩 선언과 익명 객체 (0) 2023.07.07