• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

findByName 메소드 작성 질문 있습니다.

21.08.12 11:20 작성 조회수 294

5

안녕하세요. 제가 람다랑 optional, 컬렉션 그런부분을 아직

잘몰라서 자바 공부가 더 필요한데요. 이 부분 듣다가

궁금증이 있어서 질문 남기게 됐습니다.

- 중점적인 내용은 `findName 메소드를 findById메소드

처럼 구현하면 안되냐`입니다.

-> 다른 질문글을 통해 id는 유일한 기본키로 사용되서 

중복이 없고, 이름은 중복이 있을 수 있다고 하셨습니다.

제가 코드는 정확히 모르겠지만 영한님의 강의를 들어보며

추측해보면

-> store - 객체

-> , values() - 값들중

-> . stream() - 모두 돌리는데

-> .filter() - 가로안에 있는 조건에  해당하는 값이 걸리면

-> .findAny() -리턴해라

이런 의미의 식 같습니다.

또 filter 안에 있는 람다표현식?은 

member를 받아서 받은 멤버 객체의 name이 

findByName 메소드 호출시 매개변수로 받은 name과

같은지를 체크한 것 같구요.

여기서 궁금한점이 store의 member를 하나씩 쭉 

돌리는데 우리가 매개변수로 넘겨준 name과 같은 

member를 모두 optional에 담아서 반환하는건가요?

즉, findById는 중복 없이 Optional에 하나의 Member

객체만 담아서 반환되어 코드를 저렇게 짠 것이고

findByName은 중복이 있을 수 있어,  매개변수로 받은

name과 같은 모든 member 객체를 optional에 담아

반환해주는 코드인건가요?

답변 1

답변을 작성해보세요.

4

codesweaver님의 프로필

codesweaver

2021.08.12

안녕하세요, 유진이님. 공식 서포터즈 codesweaver 입니다.
.

람다에 대해 정확히 이해하셨네요!.

다만, findAny()는 filter()로 찾은 모든 결과중 '아무값이나 하나'를 선택하라는 뜻 입니다. 그래서 filter()의 결과중 하나를 반환하게 되는데 이 값이 null일 수 있기 때문에 (filter에서 일치하는 데이터를 하나도 못 찾은 경우) Optional에 담아서 반환합니다.

.findAny()와 유사하지만 '결과 중 첫번째 값을 하나'선택하는 findFirst() 메서드도 있습니다. findFirst()도 Optional로 감싼 Member를 반환하게 됩니다. 

.

Optional로 감싼 값을 반환하고 싶지 않은 경우는 다음과같이 작성하기도 합니다.

public Member findByName(String name) {

    store.values().stream()

        .filter(member -> member.getName().equals(name))

        .findAny()

        .orElse(new Member());

}

orElse()가 붙게 되면, findAny()의 결과가 존재하면 그 값을 그대로 반환하지만, 없을 경우는 orElse()의 괄호  안의 데이터를 반환합니다. 여기서 빈 Member를 생성해서 반환하기 때문에 이 메서드는 어떤 경우에도 null이 반환되지 않고 Member가 반환되는것을 보장합니다. (사실 지금 보여드린 예제는 텅 빈 멤버를 반환하고 있는데 이건 의미가 없는 코드처럼 보입니다. 이동욱 님의 enum 에서의 orElse() 를 사용한 예시가 더 적절한 예시입니다. 아래 링크의 내용중 findByPayCode() 메서드를 확인해보세요)

Java Enum 활용기 | 우아한형제들 기술블로그 (woowahan.com)

.

람다는 사용되는 곳이 어느정도 정해져있기에, 수업을 진행해 나가시다보면 자연스럽게 사용하게 되실거에요!

감사합니다.

유진이님의 프로필

유진이

2021.08.13

답변 고맙습니다..! 그런데 답변을 보니 궁금한게 findAny가 결과중 아무값이나 하나를 선택하는

것이라면 findById와 다르게 짠 이유를 잘 모르겠습니다.. 저는 id는 고유값이고 name은 중복이

가능한 값이라고 답변이 달렸길래, findAny를 통해 여러 값을 돌려서 반환하지 않을수도, 

하나를 반환할 수도, 여러개를 반환할 수도 있는줄 알았습니다. 하지만 findAny가 아무값이나

하나를 반환한다는 것을 보면 findByid 메소드의 return Optional.ofNullable(store.get(id));

와 동일하게 return Optional.ofNullable(store.get(name)); 이렇게 해도 되는거 아닌가요..?

감사합니다.  

mission0705님의 프로필

mission0705

2021.08.23

Map에서 get(para)메소드는 para에 'key'값을 넣으면 'value'값이 리턴이 되는 메소드입니다. 그래서 이름으로 멤버객체를 찾으려면 강사님께서 사용하신 방법을 써야할 거 같습니다.