스트림

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));

스트림 특징

  • 람다식으로 요소 처리 코드를 제공한다.

    • 매개값으로 람다식 또는 메소드 참조를 대입할 수 있다.

          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