메서드 참조

のの·2020년 12월 26일

익명 클래스


public static void main(String[] args) {
        List<BaseballPlayer> list = new ArrayList<>();

        list.sort(new Comparator<BaseballPlayer>() {
            @Override
            public int compare(BaseballPlayer o1, BaseballPlayer o2) {
                return o1.getPlayerName().compareTo(o2.getPlayerName());
            }
        });
        

람다


public static void main(String[] args) {
        List<BaseballPlayer> list = new ArrayList<>();
        list.sort( (BaseballPlayer o1, BaseballPlayer o2) -> o1.getPlayerName().compareTo(o2.getPlayerName()));
};
        

메서드 참조


public static void main(String[] args) {
        List<BaseballPlayer> list = new ArrayList<>();
        list.sort(Comparable::compareTo);
});
        

public class SortCollection {

    public static void main(String[] args) {
        List<BaseballPlayer> list = new ArrayList<>();

        BaseballPlayer o1 = new BaseballPlayer("C");
        BaseballPlayer o2 = new BaseballPlayer("B");
        BaseballPlayer o3 = new BaseballPlayer("A");
        
        list.add(o1);
        list.add(o2);
        list.add(o3);
        
        list.sort(Comparable::compareTo);

        for(BaseballPlayer baseballPlayer : list){
            System.out.println(baseballPlayer);
        }
    }
}i

result
BaseballPlayer{playerName='A'}
BaseballPlayer{playerName='B'}
BaseballPlayer{playerName='C'}

람다 표현식을 사용함으로써 얻을 수 있는 장점

  • 이름 없는 함수를 선언할 수 있다. 메서드는 반드시 특정 클래스나 인터페이스 안에 포함되어야 하고 메서드의 이름이 있어야 하지만, 람다 표현식은 이러한 제약에서 벗어날 수 있다. 프로그래밍 시 제약 조건이 완화되어서 유연성이 생긴다.

  • 소스 코드의 분량을 획기적으로 줄일 수 있다. 반복적으로 작업해야 하는 기존의 비효율적인 코드 작성 방식이 필요없다.

  • 코드를 파라미터로 전달할 수 있다. 외부에서 동작을 정의해서 메서드에 전달할 때 편리하게 사용할 수 있다.

람다 표현식 이해

익명 클래스를 단순화하여 그 표현식을 메서드의 인수로 전달하거나 인터페이스의 객체를 생성할 수 있는 기능을 제공한다.

  1. 파라미터 값 소비

(String name) -> System.out.println(name)

  • 파라미터로 전달된 값을 기반으로 데이터를 처리하고 완료한다.
  • 리턴 타입이 void 유형이다.
  1. 불 값 리턴

(String value) -> "somevalue.equals(value)

  • 파라미터로 전달된 값을 기반으로 불 값을 리턴한다.
  • 주로 전달된 값의 유효성을 검증하거나 전달된 값들을 비교하는 작업을 한다.
  1. 객체 생성

() -> new SomeClass()

  • 파라미터로 전달되는 것 없이 객체를 생성하여 리턴 값도 없다.
  1. 객체 변형

(String a) -> a.substring(0,10)

  • 파라미터로 전달된 값을 변경해서 다른 객체로 리턴한다.
  1. 값을 조합

(int min, int max) -> (min + max) / 2

  • 파라미터로 전달된 값을 조합해서 새로운 값을 리턴한다.
  1. 람다 표현식 자체를 변수로 선언
public static Runnable getRunnable(){
	return () -> System.out.println("hello world");
}
    
public static void main(String[] args) {
        Thread thread1 = new Thread( () -> System.out.println("hello world"));
        Runnable run = () -> System.out.println("hello world");
        Thread thread2 = new Thread(run);
        Runnable run2 = getRunnable();
        Thread thread3 = new Thread(run2);
    }
  1. 형식 추론
  • 파라미터로 전달될 데이터의 타입 부분도 제거할 수 있다.
    인터페이스에 정의되어 있는 메서드의 파라미터 타입은 사전에 정의하거나 제네릭을 이용해서 타입을 선언한다.

    예를들어 다음 두개의 코드는 동일한 람다 표현식이다.
    (String a) -> System.out.println("a");
    (a) -> System.out.println("a");


profile
wannabe developer

0개의 댓글