Java

Java Stream

혀눅짱 2023. 4. 20. 10:21

Stream

  • ●  sequence of elements supporting sequential and parallel aggregate operations
  • ●  데이터를 담고 있는 저장소 (컬렉션)이 아니다.
  • ●  Funtional in nature, 스트림이 처리하는 데이터 소스를 변경하지 않는다.
  • ●  스트림으로 처리하는 데이터는 오직 한번만 처리한다.
  • ●  무제한일 수도 있다. (Short Circuit 메소드를 사용해서 제한할 수 있다.)
  • ●  중개 오퍼레이션은 근본적으로 lazy 하다.
  • ●  손쉽게병렬처리할수있다.

스트림 파이프라인

  • ●  0 또는 다수의 중개 오퍼레이션 (intermediate operation)과 한개의 종료 오퍼레이션
  • (terminal operation)으로 구성한다.
  • ●  스트림의 데이터 소스는 오직 터미널 오퍼네이션을 실행할 때에만 처리한다.
  • 중개 오퍼레이션
  • ●  Stream을 리턴한다.
  • ●  Stateless / Stateful 오퍼레이션으로 더 상세하게 구분할 수도 있다. (대부분은 오퍼레이션은 Stateful 오퍼레이션이다.)
  • Stateless지만 distinctsorted 처럼 이전 이전 소스 데이터를 참조해야 하는
  • ●  filter, map, limit, skip, sorted, ...
  • 종료 오퍼레이션
  • ●  Stream을 리턴하지 않는다.
  • ●  collect, allMatch, count, forEach, min, max, ...

 

 

 

public class MainClass {

    public static void main(String[] args) {
       
        List<OnlineClass> springClass = new ArrayList<>();
        springClass.add(new OnlineClass(1,"spring boot",true));
        springClass.add(new OnlineClass(2,"spring data jpa",true));
        springClass.add(new OnlineClass(3,"spring mvc",false));
        springClass.add(new OnlineClass(4,"spring core",false));
        springClass.add(new OnlineClass(5,"rest api development",false));

        System.out.println("spring으로 시작하는 수업");
        springClass.stream().filter(c -> c.getTitle().startsWith("spring")).forEach(oc -> System.out.println(oc.getId()));



        System.out.println("close 되지 않은 수업");
        springClass.stream().filter(Predicate.not(OnlineClass::isClosed)).forEach(oc -> System.out.println(oc.getId()));

        System.out.println("수업이름만 모으기");

        springClass.stream().map(OnlineClass::getTitle).forEach(System.out::println);

        System.out.println("스프링수업중에 제목에 spring이 들어간것만 리스트로 만들기");
        List<String> springStringList = springClass.stream().
                filter(oc -> oc.getTitle().contains("spring")).
                map(OnlineClass::getTitle).
                collect(Collectors.toList());

     }
    }

 

람다랑 스트림을 jpa공부할때 뭣모르고 썼었는데  더 자바 강의를 듣고나니 이해가 좀 되기 시작한다. 람다스트림을 잘만 활용하면 불필요한  루프문과 dto와 dto간의 데이터 복사 로직을 줄일 수 있을것 같다.