TIL 2021.05.25 [Java/Lambda&Stream]

Kyu·2021년 5월 25일
0

TIL

목록 보기
135/322

Java 8

Lambda & Stream

오늘은 Lambda와 Stream에 대해서 배웠다.
항상 미루고 미루고 미루다 오늘은 해야할때라고 생각했다.
왜냐면 Entity/DTO 두 객체간의 타입을 바꿔줄때마다 Stream이 필요하기 때문이었다.

처음 이 문제를 겪은건 지지난 sidedish 프로젝트 때이다.
예시를 하나 가져오면 다음과 같다. (전체 코드)

    public List<CategoryDto> findAllBestBanchansByCategories() {
        Iterable<Category> categoryList = categoryRepository.findAll();
        Set<String> setOfCategoryIds = new HashSet<>();
        for (Category category : categoryList) {
            setOfCategoryIds.add(category.getCategory_id());
        }

        List<CategoryDto> categoryDtoList = new ArrayList<>();
        for (String category_id : setOfCategoryIds) {
            categoryDtoList.add(findBestBanchansByCategory(category_id));
        }
        return categoryDtoList;

Entity의 List인 Iterable<Category>로 받았다가 List<CategodyDTO>로 변환해주는 서비스단의 로직이다.

이 때에도 람다와 스트림을 몰랐다.
그래서 스트림을 안쓰고 for-each문으로 해결했다.
그러다가 나중에 리뷰를 받고나서 stream().map()으로 해결할 수 있다는 것을 알았다.

위에 있는 코드를 stream().map()으로 바꾸면 다음과 같을 것이다.

public List<CategoryDto> findAllBestBanchansByCategories() {
    Iterable<Category> categoryList = categoryRepository.findAll();
    List<CategoryDto> categodyDtoList = categoryList.strream().
                                        .map(category -> CategoryDto.of(category))
                                        .collect(Collectors.toList());
    return categodyDtoList;
}

와우 완전 깔끔해졌다.
of()라는 Entity를 DTO로 바꿔주는 메서드를 작성하고 저런식으로 사용하면 마법이 일어난다.

이런 식으로 계속 반복이 일어나다보니 제대로 알고 사용해야겠다는 마음이 계속 생겼다
리뷰를 들었을 때도 사실 공부를 안했지만 반복적으로 API를 만드는 프로젝트를 계속 하다보니,
람다와 스트림을 공부를 안할래야 안할수가 없다. ㅎㅎ

자바8에서 제공하는 람다와 스트림에는 정말 많은 기능들이 있다.
그래서 오늘 할수있는 만큼만 해보기로..

Lambda

람다식은 메서드를 선언부없이 구현부만으로 하나의 식Expresion으로 표현한것이다.
그런데 자바에서는 이런 식만 가지고 사용할 수 없다.

자바에서 제공하는 람다식은 일반적인 객체가 아니라 인터페이스를 구현한 익명구현객체를 생성한다.

일회성이며, 재사용할 필요 없고 파일단위의 관리 대상이 아닌 객체를 만들때 익명구현객체를 활용

그래서 람다식을 알기 위해서는 먼저 하나의 인터페이스부터 시작해야한다.

다음과 같이 계산기라는 인터페이스가 있다고 해보자.

interface Calculator {
  int cal(int n);
}

이 인터페이스를 아래처럼 사용할 수 있을 것이다.

class Person {
  public static void main(String[] args) {
    int n = 2;
    Calculator cal = new Calculator() {
      @Override
      int cal(int n) {
        return n + 1;
      }
    }
  }
}

그런데 이렇게 사용하려하면 java파일을 하나 만들어서 코드를 작성해야하고 한번 사용하고 말거지만 계속 가지고 있어야하니까 그만큼 유지보수비가 증가한다.

그래서 람다식으로 익명구현객체를 생성하는 것이다.
여러가지 생략하는 표현방법이 있지만 기본적인 방법으로 코드를 표현하면 다음과 같다.

class Person {
  public static void main(String[] args) {
    int n = 2;
    Calculator cal = (int n) -> {return n + 1;};
  }
}

Stream

스트림은 구글이미지로 검색해보면 요런식으로 나오는데
유추해보면 어떤 데이터를 요리조리 가공해서 뱉어내는거라고 알수있다.

실제로 찾아보니 자바의 Collection 인터페이스의 요소들로 요리조리 가공하는거 같은데,,
일단 시간관계상 Stream은 나중에 배워보기로.


To learn more
[JAVA] 예제로 배워보는 Stream & Lambda

profile
TIL 남기는 공간입니다

0개의 댓글