ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스트림(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. 내부반복자

    출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=qkrghdud0&logNo=220702640712

     

    -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. 중간처리와 최종처리

     

    출처:https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=qkrghdud0&logNo=220702640712

     

    - 스트림은 하나 이상 연결될 수 있다. 

    - 하나 이상의 스트림이 연결되어 있는 것을 스트림 파이프라인 이라고 한다.

     

    중간 스트림들은 최종 처리를 위한 필터링,요소변환(매핑),정렬 등을 수행

    - 최종 처리는 중간 스트림의 결과를 사용하여 카운트,총합,평균 등을 구하는 작업을 진행한다.

     

    //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. 리소스로부터 스트림 얻기

     

    - 주로 이미 만들어진 컬렉션과 배열등을 통해 스트림을 얻을 수 있다.

    - 아래와 같은 방법으로 스트림 구현객체를 얻을 수 도 있다.

    출처: https://velog.io/@dev-taewon-kim/Chapter-17-%EC%8A%A4%ED%8A%B8%EB%A6%BC-%EC%9A%94%EC%86%8C-%EC%B2%98%EB%A6%AC

    //컬렉션으로부터 스트림 얻기
    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
Designed by Tistory.