JAVA/JAVA8 관련
[더 자바8] STREAM API
JUMP개발자
2022. 3. 20. 16:49
Stream
자바 8에서 추가된 스트림(Stream)은 람다를 활용할 수 있는 기술중 하나이다.
스트림은 '데이터의 흐름'으로, 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다.
public class App {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("jump");
names.add("jumplope");
names.add("ff");
names.add("gg");
Stream<String> stringStream = names.stream().map(String::toUpperCase);
stringStream.forEach(System.out::println);
System.out.println("===========================");
}
}
결과
JUMP
JUMPLOPE
FF
GG
===========================
operator
- 중계(intermediate)오퍼레이션 : stream을 리턴함.
중계 오퍼레이션을 LAZY하다라고 하는데, 종료 오퍼레이션이 올때까지 실행하지 않음.
List<String> collect = names.stream().map((s)-> {
System.out.println(s); // 출력 X
return s.toUpperCase();
});
List<String> collect = names.stream().map((s)-> {
System.out.println(s); // 출력 O
return s.toUpperCase();
}).collect(Collectors.toList());
-종료(terminal) 오퍼레이션 : ex:) collect
parallelStream
- 여러 쓰레드에서 돌아감
- 병렬이라고 무조건 좋지는 않음. (쓰레드 만들고 수집하는 비용)
- 데이터가 방대한 경우에는 추천
List<String> collect = names.parallelStream().map((s) -> {
System.out.println(s + " [Thread name] > " + Thread.currentThread().getName());
return s.toUpperCase();
}).collect(Collectors.toList());
결과
jump [Thread name] > ForkJoinPool.commonPool-worker-23
jumplope [Thread name] > ForkJoinPool.commonPool-worker-19
ff [Thread name] > main
gg [Thread name] > ForkJoinPool.commonPool-worker-5
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));
System.out.println("spring 으로 시작하는 수업");
springClasses.stream().filter(oc->oc.getTitle().startsWith("spring"))
.forEach(oc->System.out.println(oc.getId()));
System.out.println("close 되지 않은 수업");
springClasses.stream().filter(oc->!oc.isClosed())
.forEach(oc->System.out.println(oc.getId()));
// 같음
springClasses.stream().filter(Predicate.not(OnlineClass::isClosed))
.forEach(oc->System.out.println(oc.getId()));
System.out.println("수업 이름만 모아서 스트림 만들기");
// TODO
springClasses.stream()
.map(OnlineClass::getTitle)
.forEach(System.out::println);
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>> jumpEvents = new ArrayList<>();
jumpEvents.add(springClasses);
jumpEvents.add(javaClasses);
System.out.println("두 수업 목록에 들어있는 모든 수업 아이디 출력");
// TODO
jumpEvents.stream().flatMap(Collection::stream)
.forEach(oc->System.out.println(oc.getId()));
System.out.println("10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10개 까지만");
// TODO
Stream.iterate(10,i->i+1)
.skip(10)
.limit(10)
.forEach(System.out::println);
System.out.println("자바 수업 중에 Test가 들어있는 수업이 있는지 확인");
// TODO
boolean test= javaClasses.stream().anyMatch(oc -> oc.getTitle().contains("Test"));
System.out.println(test);
System.out.println("스프링 수업 중에 제목에 spring이 들어간 제목만 모아서 List로 만들기");
// TODO
List<String> spring = springClasses.stream()
.filter(oc -> oc.getTitle().contains("spring"))
.map(OnlineClass::getTitle)
.collect(Collectors.toList());
spring.forEach(System.out::println);
}
}