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지만 distinct나 sorted 처럼 이전 이전 소스 데이터를 참조해야 하는
- ● 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간의 데이터 복사 로직을 줄일 수 있을것 같다.