티스토리 뷰

스프링, 자바

Lambda, Stream : wip

killog 2021. 1. 24. 14:51
반응형

정리하려고 쓴글인데 https://kils-log-of-develop.tistory.com/659?category=923003 이 글이 좀 더 잘썼다. 아직 좀 더 고민이 필요한 부분이다.

람다식

함수적 프로그래밍

  • y=f(x) 형태의 함수로 구성된 프로그래밍 기법
    • 데이터를 매개값으로 전달하고, 결과를 받는 코드들로 구성
    • 객체 지향 프로그래밍보다 효율적인 경우
      • 대용량 처리시 유리
        • 데이터 포장 객체를 생성 후 처리하는 것보다, 데이터를 바로 처리하는 것이 속도에 유리하다.
        • 멀티 코어 cpu 에서 데이터를 병렬 처리하고, 취합할때, 객체보다 함수가 유리하다.
      • 이벤트 지향 프로그래밍(이벤트가 발생하면 핸들러 함수 실행)에 적합
        • 반복적인 이벤트 처리는 핸들러 객체보다는 핸들러 함수가 적합
  • 현대적 프로그래밍 기법
    • 객체 지향 프로그래밍 + 함수적 프로그래밍

자바 8부터 함수적 프로그래밍 지원

  • 람다식을 언어 차원에서 제공
    • 람다 계산법에서 사용될 식을 프로그래밍 언어에 접목
    • 익명함수를 생성하기 위한 식
    • (타입 매개변수, ..) ->{ 실행문; ...}
  • 자바에서 람다식을 수용한 이유
    • 코드가 매우 간결해진다.
    • 컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해서 쉽게 집계할 수 있다.

Stream(java 8)

  • 간단하게 내부 반복자 라고 부르기도 합니다.
  • 요소들을 내부적으로, 반복적으로 처리할 때 사용이 됩니다.

스트림은 반복자

컬렉션(배열 포함)의 요소를 하나씩 참조해서 람다식(java 8)으로 처리할 수 있는 반복자이다.

  • 자바 7 이전 코드
List<String> list = Arrays.asList("소녀시대", "슈퍼주니어", "에스파", "트와이스");
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
      String name = iterator.next();
      System.out.println(name);
    }
  • 자바 8 이후 코드
    List<String> list = Arrays.asList("소녀시대", "슈퍼주니어", "에스파", "트와이스");
    Stream<String> stream = list.stream();
    stream.forEach(name -> System.out.println(name));

스트림 특징

람다식으로 요소 처리 코드를 제공한다.

  • 스트림이 제공하는 대부분의 요소 처리 메소드는 함수적 인터페이스 매개타입을 가진다.
  • 매개값으로 람다식 또는 메소드 참조를 대입할 수 있다.
    List<Student> list =
        Arrays.asList(new Student("길재은", 100), new Student("김우소", 70), new Student("Hammer", 99));
    Stream<Student> stream = list.stream();
    stream.forEach(
        student -> {
          System.out.println(student.getName() + "-" + student.getScore());
        });

내부 반복자를 사용하므로 병렬처리가 쉽다.

  • 개발자는 요소 처리 코드에만 직중할 수 있다.
  • 멀티 코어 CPU 를 최대한 활용하기 위해 요소들을 분배시켜 병렬 처리 작업을 할 수 있다.
  • 병렬 처리
    • 한 가지 작업을 서브 작업으로 나누고, 서브 작업들을 분리된 스레드에서 병렬적으로 처리한 후, 서브 작업들의 결과들을 최종 결합하는 방법
    • 자바는 ForkJoinPool 프레임워크를 이용해 병렬처리 한다.

병렬처리 확인
  List<Student> list =
        Arrays.asList(new Student("길재은", 100), new Student("김우소", 70), new Student("Hammer", 99));
   /* 
   Stream<Student> stream = list.stream();
    stream.forEach(
        student -> {
          System.out.println(student.getName() + ":" + Thread.currentThread().getName());
        });
    */
    Stream<Student> paralleStream = list.parallelStream();
    paralleStream.forEach(
        student -> {
          System.out.println(student.getName() + Thread.currentThread().getName());
        });

스트림은 중간 처리와 최종 처리를 할 수 있다.

  • 중간 처리: 요소들 매핑, 필터링, 정렬
  • 최종 처리: 반복, 카운트, 평균 , 총합.

  List<Student> list =
        Arrays.asList(new Student("길재은", 100), new Student("김우소", 70), new Student("Hammer", 99));
    System.out.println("평균:" + list.stream().mapToInt(Student::getScore).average().getAsDouble());
    // 평균:89.66666666666667

스트림 종류


참고 문헌

이것이 자바다

https://www.youtube.com/watch?v=2D9NRBIKKCcdl

https://www.youtube.com/watch?v=yDlNLOu6o4s&list=PLVsNizTWUw7FPokuK8Cmlt72DQEt7hKZu&index=147

반응형

'스프링, 자바' 카테고리의 다른 글

자바 서블릿 요약  (0) 2021.01.26
jsp 데이터베이스 사용 간단 정리본  (0) 2021.01.26
자바의 직렬화(Java Serialization)  (0) 2021.01.24
NIO 기반 입출력 및 네트워킹  (0) 2021.01.23
jsp 와 세션  (0) 2021.01.19
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함