-
[더 자바8] STREAM APIJAVA/JAVA8 관련 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-5Stream 문제풀이 예제
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); } }
'JAVA > JAVA8 관련' 카테고리의 다른 글
Optional API 사용 (0) 2022.04.17 [더 자바8] Opitonal 소개 (0) 2022.04.05 [더 자바8] 인터페이스 기본 메소드와 스태틱 메소드 (0) 2022.02.13 [더 자바 8] 메소드 레퍼런스 (0) 2022.02.13 [더 자바 8] 람다 표현식 (0) 2022.02.06