Stream API에 map()에는 람다식과 메서드 참조가 인수로 들어가야한다고 한다.
여기서 람다식은 익명클래스를 간결하게 작성하기 위해 나온 문법이다.
익명 클래스
이름 없는 클래스
일회성
인터페이스 구현 또는 추상 클래스 상속받아 그 메서드를 바로 정의할 때 사용
클래스 파일 따로 정의하지 않고, 코드 내에서 즉석으로 구현하는 방식
java 8 이전 방식 8버전에서도 사용해도 에러는 발생 안함
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello from Anonymous Class!");
}
};
new Thread(runnable).start();
람다식
익명클래스를 더 간단하게 표현하기 위한 방식(Java 8이후)
함수형 인터페이스(구현해야할 메서드(추상메서드)가 하나뿐인 인터페이스)를 구현할 때 사용가능
간결한 코드, 가독성 높은 코드
Runnable runnable = () -> System.out.println("Hello from Lambda!");
new Thread(runnable).start();
메서드 참조
람다식보다 간결하게 하는 기능
기존 메서드나 생성자를 참조하여 더 간단하게 표현
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
// 람다식
names.forEach(name -> System.out.println(name));
// 메서드 참조
names.forEach(System.out::println);
4가지 유형 존재
- 정적 메서드 참조: ClassName::staticMethod
- 특정 객체의 인스턴스 메서드 참조: instance::instanceMethod
- 임의 객체의 인스턴스 메서드 참조: ClassName::instanceMethod
- 생성자 참조: ClassName::new
본론으로 돌아와서
Stream API 의 map()과 같은 메서드는 인수에 Function<T, R> 이라는 함수형 인터페이스를 구현해야한다.
그걸 람다식과 메서드 참조로 하는 것이다.
Function<T, R> 에는 R apply(T t); 라는 추상 메서드가 존재한다.
이걸 구현해줘야하는 것
익명 클래스, 람다식, 메서드 참조 코드를 보면
// 익명 클래스 방식
Function<String, Integer> lengthFunction = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return s.length(); // 문자열의 길이를 반환
}
};
// 람다식
Function<String, Integer> lengthFunction = s -> s.length();// 메서드를 구현
// 메서드 참조
Function<String, Integer> lengthFunction = String::length;// 이미 있는걸 가지고 와 구현
추가적으로
map과 mapToInt(Double, Long)
map은 모든 타입의 스트림 사용가능
-> 변환 후 Stream<객체형>
mapTorInt 기본형 스트림으로 변환할 때 사용
-> 변환 후 기본형Stream
-> 바로 sum(), average() 같은 계산 메서드 사용가능
'공부일지 > Java' 카테고리의 다른 글
JAVA, 스트림(Stream) (0) | 2024.10.23 |
---|---|
[JAVA] Arrays.asList() (0) | 2024.07.04 |
[JAVA] String, StringBuffer, StringBuilder (0) | 2024.07.01 |
[JAVA] 6/21에 배운 것 (0) | 2024.06.26 |
[JAVA] 6/20 배운거 클래스 (0) | 2024.06.20 |