[더 자바, Java8] 3. Stream
출처 ‣ 더 자바 Java 8, 백기선 / 인프런
3. Stream
연속된 데이터를 처리하는 함수. 파이프라인.
List<String> names = new ArrayList();
names.add("esjo");
names.add("joe");
names.add("cho");
Stream<String> stringStream = names.stream().map(String::toUpperCase); // stream을 리턴
names.forEach(System.out::println); // output → esjo joe cho *데이터는 변경되지 않는다.
1) operator
a. 중계(intermediate)오퍼레이션 = stream을 리턴
ex. map
- lazy하다 = 종료(terminal) 오퍼레이션 이 올때 까지 실행하지 않음
// 중계
names.stream().map((s) -> {
System.out.println(s); // print안됨!
return s.toUpperCase();
});
// 중계 + 종료
names.stream().map((s) -> {
System.out.println(s); // 출력됨
return s.toUpperCase();
}).collect(Collectors.toList); // return List
b. 종료(terminal) 오퍼레이션 ex. Collect
3.1 parallelStream
- 다른 쓰레드에서 돌아감
- 병렬이라고 좋지만은 않음. 쓰레드 만들고 수집 비용. 컨텍스트 스위칭 비용.
- 단, 데이터가 방대한 경우는 추천
List<String> collect = names.parallelStream().map((s) -> {
System.out.println(s + " [Thread name] > " + Thread.currentThread().getName());
return s.toUpperCase();
}).collect(Collectors.toList());
collect.forEach(System.out::println);
// output
cho [Thread name] > ForkJoinPool.commonPool-worker-5
joe [Thread name] > main
esjo [Thread name] > ForkJoinPool.commonPool-worker-3
ESJO
JOE
CHO
3.2 Stream API
3.2.1 예제
https://github.com/eunsolJo/algorithm-study/commit/273fad333fa755b01ae475a4e2e33e38de2bc529
3.3.1 풀이
https://github.com/eunsolJo/algorithm-study/commit/e8cee6d3f92748bc85cc0c850502569d4e2f4f18
package java8.streamtest;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class App {
public static void main(String[] args) {
List<OnlineClass> springClasses = new ArrayList<>();
springClasses.add(new OnlineClass(1, "spring boot", true));
springClasses.add(new OnlineClass(2, "spring data jpa", true));
springClasses.add(new OnlineClass(3, "spring mvc", false));
springClasses.add(new OnlineClass(4, "spring core", false));
springClasses.add(new OnlineClass(5, "rest api development", false));
List<OnlineClass> javaClasses = new ArrayList<>();
javaClasses.add(new OnlineClass(6, "The Java, Test", true));
javaClasses.add(new OnlineClass(7, "The Java, Code manipulation", true));
javaClasses.add(new OnlineClass(8, "The Java, 8 to 11", false));
List<List<OnlineClass>> eunsolEvents = new ArrayList<>();
eunsolEvents.add(springClasses);
eunsolEvents.add(javaClasses);
System.out.println("1. spring 으로 시작하는 수업");
eunsolEvents.stream().flatMap(e -> e.stream())
.filter(e -> e.getTitle().startsWith("spring"))
.forEach(System.out::println);
System.out.println("\n2. close 되지 않은 수업");
eunsolEvents.stream().flatMap(e -> e.stream())
.filter(e -> e.isClosed() == false)
.forEach(System.out::println);
// Predicate 함수형 인터페이스의 not 사용 + 메소드 레퍼런스
eunsolEvents.stream().flatMap(e -> e.stream())
.filter(Predicate.not(OnlineClass::isClosed))
.forEach(System.out::println);
System.out.println("\n3. 수업 이름만 모아서 스트림 만들기");
eunsolEvents.stream().flatMap(e -> e.stream())
.map(OnlineClass::getTitle)
.forEach(System.out::println);
System.out.println("\n4. 두 수업 목록에 들어있는 모든 수업 아이디 출력");
eunsolEvents.stream().flatMap(e -> e.stream())
.map(OnlineClass::getId)
.forEach(System.out::println);
System.out.println("\n5. 10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10개 까지만");
// Stream.iterate 사용
//Stream.iterate(10, i -> i + 1).forEach(System.out::println); // 무한대로 출력함
Stream.iterate(10, i -> i + 1)
.skip(10)
.limit(10)
.forEach(System.out::println);
System.out.println("\n6. 자바 수업 중에 Test가 들어있는 수업이 있는지 확인");
boolean hasTest = eunsolEvents.stream()
.flatMap(e -> e.stream())
.anyMatch(e -> e.getTitle().indexOf("Test") != -1);
System.out.println(hasTest); // true
System.out.println("\n7. 스프링 수업 중에 제목에 spring이 들어간 것만 모아서 List로 만들기");
List<OnlineClass> spring = eunsolEvents.stream()
.flatMap(e -> e.stream())
.filter(e -> e.getTitle().startsWith("spring"))
.collect(Collectors.toList());
spring.forEach(System.out::println);
}
}
Author And Source
이 문제에 관하여([더 자바, Java8] 3. Stream), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@agpine12/더-자바-Java8-3.-Stream저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)