Java - Stream과 Lambda

Stream 정리

  • Java Stream은 데이터를 추상화하여 데이터 타입과 무관하게 간결하고 일괄적으로 데이터(컬렉션, 배열)를 처리할 수 있게 하는 Api이다.  

  • Java Stream 특징

    • 일회성이다. 반환값을 정의하지 않는 한 재사용이 불가하며, 처리한 결과물은 사라진다.

    • 기존 자료를 변경하지 않는다.

    • 최종 연산이 호출되어야 중간연산이 진행된다.

 

  • 중간 연산

    • filter

      • 조건문 사용 -> 조건문에 해당하는 데이터만 가져옴

      • list.stream().filter(i -> i.getNumber() > 10)

      • filter() + findAny() 조합도 유용

  • map

    • 각 요소에서 특정 속성만을 추출하여 가져옴

    • list.stream().map(i -> i.getId())

  • sorted

    • .sorted() | .sorted(Comparator.comparing(기준 람다식))

    • 역순

      • .sorted(Comparator.reverseOrder()) 

      • .sorted(Comparator.comparing(기준 람다식).reversed())

 

  • 최종 연산

    • forEach

      • filter나 map과 같은 중간연산이 없다면
        Stream.forEach()보다 Collection.forEach()로 작업하는 것이 thread-safe하다.

    • count

    • sum

      • list.stream().mapToInt(i -> i.getPrice()).sum()

 

  • reduce(초기값, (a, b) -> {실행문})

    • reduce(0, (a, b) -> a + b)

      • 위의 예시는 최종적으로 요소들의 합이 반환하는 코드이다.

    • "", (s1, s2) -> if(s1.length >= s2.length) return s1; else return s2;

      • 위의 예시는 가장 긴 문자열 반환하는 코드이다.

 

  • collect

    • list

      • stream().map().collect(Collectors.toList())

    • map

      • stream().filter().collect(Collectors.toMap(i -> i.getKey(), i -> i.getValue()))

      • stream().collect(Collectors.toMap(Object::getId, Function.identity()))
        Function.identity() 가 Object 반환
        toMap 사용 시 중복 key있을 경우 k, v 설정 뒤에 (e1, e2) -> e1) 추가하여 처리

    • grouping

      • stream().collect(Collectors.groupingBy(i -> i.getId()))

      • 반환값은 Map<Long, List<Object>> 아이디를 기준으로 그룹화됨

 

 

Lambda 정리

  • 람다란 단일 추상 메서드를 가지는 함수형 인터페이스를 활용하는 문법이다.

    • 람다와 메서드 참조를 통해 함수형 프로그래밍을 더욱 효과적으로 구현할 수 있다.

  • 람다의 특징

    • 매개변수만으로 자료를 처리한다.

    • 독립적이기에 병렬처리에 적합하다.

    • 람다식을 변수로 활용 가능하다.

  • 람다의 구조

    • (매개변수) -> { 실행문; }

    • 매개변수가 하나일 때, 실행문이 한 줄일 때 괄호 생략이 가능하다.

    • 매개변수 -> 실행문

  • 람다 예시

    • (a, b) -> { return a + b }

    • (a, b) -> a == b ? a : b 

    • age -> age > 19 ? '성인' : '미성년자'

  • 메서드 참조 예시

    • Object::method

    • 생성자의 경우 Object::new

      • 기본 생성자라면 () -> new Object(); 와 같음

      • 매개변수가 있다면 i -> new Object(i);와 같음

 

 

댓글을 작성해보세요.

  • highlrang
    highlrang
    • 함수형 프로그래밍

    • 함수형 인터페이스 -> 람다; 하나의 메서드