후행 람다 (Trailing Lambda)
함수의 마지막 인자가 함수(람다)인 경우, 소괄호 밖으로 뺄 수 있다라는 규칙이 있음
- 규칙 1: 마지막 인자가 함수면 ) 뒤에 { }를 붙여서 쓸 수 있음.
- 규칙 2: 인자가 두 개 이상일 때, 마지막 람다만 밖으로 나감.
이 문법을 사용하면 마치 새로운 예약어(Keyword)를 만든 것처럼 코드를 읽을 수 있음.
if (condition) { ... }
for (item in list) { ... }
executeWithLock(lock) { ... } <- **"이 락을 가지고 이 로직을 실행해!"**라고 훨씬 직관적으로 읽힘
fun executeWithLock(lockProp: RedisKeyProperties.Lock,
exec: () -> Unit) {
val lock:RLock = redissonClient.getLock(lockProp.key)
val timeUnit = TimeUnit.MILLISECONDS
val waitTime = timeUnit.convert(lockProp.waitTime.value, lockProp.waitTime.timeUnit)
val leaseTime = timeUnit.convert(lockProp.leaseTime.value, lockProp.leaseTime.timeUnit)
if (lock.tryLock(waitTime, leaseTime, timeUnit)) {
try {
logger.info("${lockProp.key} is locked")
exec()
} finally {
lock.unlock()
logger.info("${lockProp.key} is released")
}
} else {
logger.info("${lockProp.key} can not get lock")
}
}
executeWithLock(redisKeyProperties.segmentMappingLock) {
metaMappingService.deleteMapping(request)
executed = true
}
{
metaMappingService.deleteMapping(request)
executed = true
}