람다 실습 1 - 익명 클래스를 람다로 전환
- Car 클래스는 아래와 같다.
package nextstep.fp;
import java.util.Objects;
public class Car {
private final String name;
private final int position;
public Car(String name, int position) {
this.name = name;
this.position = position;
}
public Car move(MoveStrategy moveStrategy) {
if (moveStrategy.isMovable()) {
return new Car(name, position + 1);
}
return this;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return position == car.position &&
Objects.equals(name, car.name);
}
@Override
public int hashCode() {
return Objects.hash(name, position);
}
}
- Movestrategy 추상 메서드는 아래와 같다.
public interface MoveStrategy {
boolean isMovable();
}
- 다음 테스트 코드는 MoveStrategy에 대한 익명 클래스로 구현하고 있는데 람다를 적용해 구현해보자.
// nextstep.fp.CarTest의 이동, 정지 method
public class CarTest {
@Test
public void 이동() {
Car car = new Car("pobi", 0);
Car actual = car.move(new MoveStrategy() {
@Override
public boolean isMovable() {
return true;
}
});
assertEquals(new Car("pobi", 1), actual);
}
@Test
public void 정지() {
Car car = new Car("pobi", 0);
Car actual = car.move(new MoveStrategy() {
@Override
public boolean isMovable() {
return false;
}
});
assertEquals(new Car("pobi", 0), actual);
}
}
- 람다를 적용한 코드는 아래와 같다.
public class CarTest {
@Test
public void 이동() {
Car car = new Car("pobi", 0);
Car actual = car.move(() -> true);
assertThat(actual).isEqualTo(new Car("pobi", 1));
}
@Test
public void 정지() {
Car car = new Car("pobi", 0);
Car actual = car.move(() -> false);
assertEquals(new Car("pobi", 0), actual);
}
}
car.move는 매개변수로 MoveStrategy 타입을 받고 있다.
MoveStrategy 인터페이스는 추상 메서드 isMovable 한개만을 가지고 있다.
isMovable 메서드는 매개 변수가 존재하지 않으며, boolean 값을 return 받고 있다.
public void 정지() {
Car actual = car.move(() -> false);
// isMovable 메서드는
// 매개변수가 존재하지 않으며 : ()
// return 값은 false로 지정할 것이다. : false
}
인터페이스에 존재하는 추상 메서드가 1개일 때만 가능하다.
public void 정지() {
Car actual = car.move(() -> false);
Car actual = car.move(new MoveStrategy() {
@Override
public boolean isMovable() {
return false;
}
}
}
[참고]
https://nlp.jbnu.ac.kr/PL2020/java_lambda_expression.pdf
위 파일에서 메소드의 매개변수로 람다식 전달 부분을 추가로 살펴보면 도움이 될 것이다.
'강의 > TDD, Clean Code with Java 12기' 카테고리의 다른 글
스트림(stream) (0) | 2021.08.25 |
---|---|
람다 실습 2 - 람다를 활용해 중복 제거 (0) | 2021.08.25 |
람다 (0) | 2021.08.25 |
[로또] step4 - 로또(수동) - 29일차 (0) | 2021.08.17 |
[로또] step4 - 로또(수동) - 29일차 (step3 피드백 및 피드백 반영) (0) | 2021.08.17 |