지금 인프런에서 스프링 강의를 듣고 있는데 강사님이 이런 코드를 쓰셨다.
public Optional<Member> findBYName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
여기서 나는 아직 확실히 Java 기본기를 제대로 알지 못하는구나 라는 생각이 들었고, 하나씩 공부해보기로 했다.
일단 여기서 제대로 이해 못하는 것
1. Optional<>함수
2. stream() 함수
3. m -> member.getName() 과 같은 람다식 함수
Optional 함수는 다음 포스팅에서 공부해보기로하고, 오늘은 2와 3에 대해서 제대로 이해해보려한다!
Stream API는 자바8부터 람다식과 함께 제공된 함수형 프로그래밍을 위한 기능으로,
컬렉션, 배열안에 있는 요소들을 하나씩 참조하며 반복적인 처리를 할 수 있는 것이다!
그냥 말로만 이해하기는 좀 어려우니
코드 예시를 보며 확인해보자!
* Stream쓰고 안쓰고 비교를 위해 리스트 정렬과 출력처리를 해보기.
String[] fruits = {apple, grape, orange};
//Stream 쓰지 않을 때
Arrays.sort(fruits); //원본 그대로의 데이터 정렬
//출력
for(String x: fruits) {
System.out.println(x);
}
//Stream을 썼을 때
Stream<String> fruits_stream = Arrays.stream(fruits); //Stream 객체 생성
//정렬 후 출력
fruits_stream.sorted().forEach(System.out::println);
1. Stream을 쓰지 않을 때
- 원본의 데이터가 변경된다.
- for문의 사용으로 코드가 길어진다.
2. Stream을 쓸 때
- 원본 데이터의 변경이 없다.
- 일시적이며 재사용이 불가하다.
- forEach문에 반복문이 들어가 있기에 코드가 간결하다.
* 정렬 후 출력에 사용되는 System.out::println은 람다식과 관련된 개념이다. 조금 뒤에 자세히 알아보자!
public Optional<Member> findBYName(String name) {
return store.values().stream() //stream 객체 생성
.filter(member -> member.getName().equals(name)) //filter로 가공하기
//여기서는 member라는 객체에서 getName()이름을 가져온 후, name와 동일한 것 탐색
.findAny(); //어떤 것이든 찾아서 반환, 결과
}
1. stream()으로 stream 객체를 생성한다.
2. filter()로 원하는 데이터를 뽑아낸다.
이 외에도 map() 등 가공할 수 있는 함수들이 내장되어있다.
여기에서 사용된 -> 이게 바로 람다식! 밑에서 알아보자!
3. findAny() 어떤것이든 찾음 혹은 sorted() 정렬, count() 개수를 반환 를 써서 원하는 결과를 가져온다.
이젠 위처럼 Stream API를 사용할 때, 함께 사용하게 되는 람다식에 대해 알아보자.
프로그래밍 언어에서 사용되는 개념으로 익명 함수(匿名函數, Anonymous functions)를 지칭하는 용어
읭? 이게 무슨 말이지 싶었다.
즉.. 이 말을 쉽게 풀어내자면..!
원래 우리는 메서드(함수)를 사용하기 위해 아래의 예시처럼 메서드를 정의해주고 선언해준다.
일반 메서드 예시)
public String SayHello() {
return "안녕하세요?";
}
하지만 람다식은 위의 함수사용을 이러한 방식으로 풀어내준다.
람다식 예시)
() -> "안녕하세요?"
이처럼 메소드에 대한 정의없이도 바로 간결하게 사용할 수 있도록 해주는 것이 바로 람다식이다.
함수에 대한 이름이 없기에 익명 함수라고 일컬어지는 것이다.
이런 람다식의 장점으로는
1. 코드가 간결해진다.
2. 함수를 만드는 과정이 생략되기에 생산성이 올라간다.
3. 병렬 프로그램에 사용될 수 있다.
(=스레드가 여러개 실행중일때, 다른 곳에서 또 다른 기능을 실행하는 것)
물론 단점도 존재한다.
1. 재사용이 불가능하다.
2. 남용을 하게 될 경우 오히려 코드가 더욱 복잡해진다.
3. 디버깅이 어렵다.
그래서 Test케이스를 작성할 때는 함수를 재사용할 필요가 줄어드니, 본문 제일 위의 코드 예시처럼 테스트케이스에 람다가 잘 사용될 수 있는 것 같다!
람다표현식에서 불필요한 매개변수를 제거하는 것
이것도 쉽게 말하자면 람다식의 코드를 또 간편하게 줄여주는 것이 메소드 참조 :: 이다!
코드 예시로 알아보자.
() -> System.out.println(); // 람다식 출력
System.out::println; //참조형 메서드 출력
이처럼 간편해진다.
메서드 참조는 생성자 참조도 가능하고, 정적, 인스턴스 메소드도 모두 참조 가능하다.
쉽게 이해해보는 Stream과 람다식, 그리고 메소드 참조 끝!!
zzzㅋㅋㅋㅋ
참조 사이트:
[object]객체 복사하기 (0) | 2023.03.22 |
---|---|
한번만쓰는 익명함수 (0) | 2023.03.21 |
지역중첩클래스 쓰는법 (0) | 2023.03.21 |
정적 중첩클래스, 인스턴트중첩클래스 사용법 (7) | 2023.03.21 |
제네릭 이해 (2) | 2022.12.15 |
댓글 영역