Stream API

Ahri·2021년 12월 20일
1

JAVA

목록 보기
4/6

인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.

Stream

  • 스트림으로 처리하는 데이터는 오직 한번만 처리
  • 스트림이 처리하는 원본의 데이터는 변경하지 않음
  • 중개 오퍼레이션은 근본적으로 lazy
List<String> names = new ArrayList<>();
names.add("ahreum"); names.add("jenny"); names.add("nami");

Stream<Object> stringStream = names.stream().map(String::toUpperCase);
        
// 원본 데이터를 바꾸지 않음
names.forEach(System.out::print); //ahreum jenny nami
stringStream.forEach(System.out::println); // AHREUM JENNY NAMI

//중개형 oprator는 lazy 하다. 종료형 오퍼레이터가 있어야 중개형이 실행됨. 없으면 실행 안되고 선언만 됨
names.stream().map((s) -> {
	System.out.println(s); // 실행안됨
	return s.toUpperCase();
});

names.stream().map((s) -> {
	System.out.println(s);
	return s.toUpperCase();
}).collect(Collectors.toList()); //실행됨. ahreum jenny nami

Stream 파이프라인

  1. 시작
  • 한개, stream()
  1. 중개
  • 여러개 사용 가능, Stream을 리턴
  • filter, map, limit, skip, sorted, ...
  1. 종료
  • 한개 사용 가능, Stream을 리턴하지 않음
  • collect, allMatch, count, forEach, min, max, ...

Stream API

  1. 걸러내기 : Filter(Predicate)

  2. 변경하기 : Map(Function) 또는 FlatMap(Function)

  3. 생성하기 : generate(Supplier) 또는 Iterate(T seed, UnaryOperator)

  4. 제한하기 : limit(long) 또는 skip(long)

  5. 스트림에 있는 데이터가 특정 조건을 만족하는지 확인 : anyMatch(), allMatch(), nonMatch()

  6. 개수 세기 : count()

  7. 스트림을 데이터 하나로 뭉치기 : reduce(identity, BiFunction), collect(), sum(), max()

List<B_OnlineClass> classes1 = new ArrayList<>();
classes1.add(new B_OnlineClass(1,"springBoot",true));
classes1.add(new B_OnlineClass(2,"studyWithMe",false));
classes1.add(new B_OnlineClass(3,"JPA",true));
classes1.add(new B_OnlineClass(4,"react",false));
classes1.add(new B_OnlineClass(5,"spring java8",true));

//1. 걸러내기
System.out.println("close 되지 않은 수업");
classes1.stream()
	.filter(Predicate.not(B_OnlineClass::getClosed))
	.forEach(n->System.out.println(n.getTitle())); //studyWithMe react
    

List<B_OnlineClass> classes2 = new ArrayList<>();
classes2.add(new B_OnlineClass(6,"sinNanDa",true));
classes2.add(new B_OnlineClass(7,"Test sul",false));
classes2.add(new B_OnlineClass(8,"hey",true));

List<List<B_OnlineClass>> ahreumEvents = new ArrayList<>();
ahreumEvents.add(classes1);
ahreumEvents.add(classes2);

//2. 변경하기
System.out.println("두 수업 목록에 있는 모든 수업 아이디 출력");
ahreumEvents.stream()
	.flatMap(Collection::stream)	//list 를 flat하게 만듦
	.forEach(oc -> System.out.println(oc.getId())); //1 2 3 4 5 6 7 8

// 3. 생성하기, 4. 제한하기
System.out.println("10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10개 까지만");
Stream.iterate(10, i->i+1)
	.skip(10)
 	.limit(10)
	.forEach(System.out::println);

0개의 댓글