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 문은 표현식이 아니므로 중괄호 없이는 사용할 수 없습니다.
블로그를 읽어주셔서 감사합니다. 개선이 필요한 모든 영역에 대한 의견과 제안을 자유롭게 제공하십시오. :)
Reference
이 문제에 관하여(Java의 람다 식), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rishikrishna_r/lambda-expressions-in-java-2b0c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)