Java의 람다 식

Java에서는 데이터를 인수로 전달할 수 있다는 것을 모두 알고 있지만 기능을 인수로 전달하는 것은 어떻습니까? 이 자습서에서는 그 방법을 살펴보겠습니다. 이상적인 사용 사례로 설명하겠습니다.

이상적인 사용 사례



국가에 대한 차량 추적 애플리케이션을 구축 중이고 특정 주의 모든 차량을 표시하려고 한다고 가정합니다. 예를 들어 Tamil Nadu의 차량 번호에는 'TN'이 포함되어 있습니다.

하나는 다음과 같은 자동차를 나타냅니다.

public class Car {
  String modelName;
  int modelNum;
  LocalDate registrationDate;
  String vehicleNum;             

  public String getModelName(){..}

  public void printCar() {..}

  ...
}


접근법 1: 검색 기준에 대한 메소드를 작성하십시오.

public static void printCarsIn(List<Car> cars, String state){
 for(Car c : cars) {
  if(c.getVehicleNum().contains(state)){
    c.printCar();
  }
 }
}

printCarsIn(cars, "TN");


자동차 목록의 각 인스턴스를 확인하여 차량 번호에 'TN'이 포함되어 있는지 확인합니다. 그렇다면 인쇄하십시오.

이 접근 방식은 애플리케이션을 취약하게 만들 가능성이 더 높습니다. Car 클래스에 다른 멤버 또는 해당 멤버에 대한 다른 데이터 유형이 포함되도록 업데이트하면 어떻게 됩니까? 또는 검색 기준이 변경되면 어떻게 됩니까? 정의된 모든 메서드에서 많은 코드를 다시 작성해야 합니다. 대신 검색 기준을 다른 클래스로 분리할 수 있습니다.

접근법 2: 로컬 클래스에서 검색 기준을 지정합니다.
다음 클래스는 Car의 인스턴스가 Tamil Nadu에서 온 것인지 확인합니다.

interface CheckCar {
  boolean test(Car c, String state);
}

class CheckCarsInState implements CheckCar {
  public boolean test(Car c, String state) {
    return c.getVehicleNum().contains(state);
  }
}


이제 이CheckCarsInState 클래스의 인스턴스를 생성하고 이를 사용하여 기준을 확인할 수 있습니다.

public static void printCarsIn(List<Cars> cars, String state, CheckCar tester){
  for(Car c : cars){
    if(tester.test(c, state)){
      c.printCar();
    }
  }
}

printCarsIn(cars, "TN", new CheckCarsInState());


검색 기준을 분리했지만 새 클래스를 선언하기 위한 추가 코드가 있습니다.

접근법 3: 익명 클래스 사용

클래스에서 하나의 인스턴스만 필요한 경우 anonymous class을 사용할 수 있습니다.

interface CheckCar {
  boolean test(Car c, String state);
}

public static void printCarsIn(List<Cars> cars, String state, CheckCar tester){
  for(Car c : cars){
    if(tester.test(c, state)){
      c.printCar();
    }
  }
}

//method call
printCarsIn(cars, "TN", new CheckCar() {
  public boolean test(Car c, String state) {
    return c.getVehicleNum().contains(state);
  }
});


그러나 여전히 익명 클래스는 CheckPerson 인터페이스에 메서드가 하나만 포함되어 있다는 점을 고려하면 부피가 커 보입니다. 대신 람다 식을 사용할 수 있습니다.

접근법 4: 기능을 전달하기 위한 람다 표현식CheckPerson는 기능 인터페이스(하나의 추상 메서드만 있는 인터페이스)입니다. 기능적 인터페이스에 대해 람다 식을 사용할 수 있습니다.

interface CheckCar {
  boolean test(Car c, String state);
}

public static void printCarsIn(List<Cars> cars, String state, CheckCar tester){
  for(Car c : cars){
    if(tester.test(c, state)){
      c.printCar();
    }
  }
}

printCarsIn(cars, "TN", (c, state) -> c.getVehicleNum().contains(state));


람다 식을 사용하면 함수를 호출할 때 검색할 기준을 지정합니다.

람다 식 구문
  • 매개변수 목록: 괄호로 묶인 매개변수 목록입니다. 하나의 매개변수만 사용하는 경우 괄호를 피할 수 있습니다.

  • c -> c.printCar();
    


  • 화살표 토큰, ->
  • 본문: 본문은 문 블록 또는 표현식일 수 있습니다. 단일 표현식인 경우 평가가 반환됩니다. 또는 다음과 같이 return 문을 사용할 수 있습니다.

  • c -> {
      //...
      return c.getVehicleNum();
    }
    


    참고: 단일 return 문은 표현식이 아니므로 중괄호 없이는 사용할 수 없습니다.

    블로그를 읽어주셔서 감사합니다. 개선이 필요한 모든 영역에 대한 의견과 제안을 자유롭게 제공하십시오. :)

    좋은 웹페이지 즐겨찾기