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가지 유형 존재

  1. 정적 메서드 참조: ClassName::staticMethod
  2. 특정 객체의 인스턴스 메서드 참조: instance::instanceMethod
  3. 임의 객체의 인스턴스 메서드 참조: ClassName::instanceMethod
  4. 생성자 참조: 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

+ Recent posts