Java8 - 로컬 캐시
public static void main(String[] args) {
for (int i = 0; i < 10; i++)
System.out.println(
"f(" + i + ") = " + fibonacci(i));
}
static int fibonacci(int i) {
if (i == 0)
return i;
if (i == 1)
return 1;
System.out.println("Calculating f(" + i + ")");
return fibonacci(i - 2) + fibonacci(i - 1);
}
물론 이런 방식은 매우 바보스럽다.아주 작은 수, 예를 들어fibonacci(5)에 대해서도 위의 코드는 많은 줄을 출력하고 중복 계산을 하고 있으며 출력은 다음과 같다(일부분만 캡처한다).
Calculating f(6)
Calculating f(4)
Calculating f(2)
Calculating f(3)
Calculating f(2)
Calculating f(5)
Calculating f(3)
Calculating f(2)
Calculating f(4)
Calculating f(2)
Calculating f(3)
Calculating f(2)
f(6) = 8
우리가 하고 싶은 것은 피보나치 수열을 계산하기 위해 캐시를 만드는 것이다.가장 직접적인 방법은 캐시에 모든value 값을 저장하는 것입니다.cache 생성은 다음과 같습니다.
static Map<Integer, Integer> cache = new ConcurrentHashMap<>();
(역자주: 이런 쓰기 방법은java8에서 허용된다)
캐치를 선언한 후 Map.computeIfAbsent () 방법은 키에 대응하는value 값이 존재하지 않는 상황에서 새로운value 값을 계산할 수 있습니다.초고속 캐시(Caching)!이 방법은 자동으로 실행되고 ConcurrentHashMap 대상을 사용했기 때문에 이 캐시는 안전한 루트이기 때문에 수동으로 동기화 방법을 쓸 필요가 없습니다.또 피보나 수치열을 처리할 수 있을 뿐만 아니라 다른 곳에서도 중복 사용될 수 있다.
하지만 이제fibonacci () 방법에서 캐시를 사용하는 방법을 살펴봅시다.
static int fibonacci(int i) {
if (i == 0)
return i;
if (i == 1)
return 1;
return cache.computeIfAbsent(i, (key) ->
fibonacci(i - 2)
+ fibonacci(i - 1));
}
봐봐.이보다 더 간단할 수는 없잖아.증명하고 싶으세요?좋습니다. 새로운 값을 계산할 때마다 콘솔에서 정보를 출력합니다.
static int fibonacci(int i) {
if (i == 0)
return i;
if (i == 1)
return 1;
return cache.computeIfAbsent(i, (key) -> {
System.out.println(
"Slow calculation of " + key);
return fibonacci(i - 2) + fibonacci(i - 1);
});
}
프로그램 출력은 다음과 같습니다.
f(0) = 0
f(1) = 1
Slow calculation of 2
f(2) = 1
Slow calculation of 3
f(3) = 2
Slow calculation of 4
f(4) = 3
Slow calculation of 5
f(5) = 5
Slow calculation of 6
f(6) = 8
Slow calculation of 7
f(7) = 13
Slow calculation of 8
f(8) = 21
Slow calculation of 9
f(9) = 34
자바 7에서는 어떻게 이루어질까요?
이렇게 하면 코드가 좀 더 많아집니다. Double-checked locking을 사용하여 다음을 수행할 수 있습니다.
static int fibonacciJava7(int i) {
if (i == 0)
return i;
if (i == 1)
return 1;
Integer result = cache.get(i);
if (result == null) {
synchronized (cache) {
result = cache.get(i);
if (result == null) {
System.out.println(
"Slow calculation of " + i);
result = fibonacci(i - 2)
+ fibonacci(i - 1);
cache.put(i, result);
}
}
}
return result;
}
주: 당신의 실제 해결 방안은 Guava Caches에 사용될 가능성이 높습니다.
요약: Lambdas 표현식은 Java8에서 매우 중요한 부분입니다.라이브러리에 추가된 모든 새로운 기능을 잊지 마십시오.
텍스트:http://blog.jooq.org/2014/02/28/java-8-friday-goodies-easy-as-pie-local-caching/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JavaScript의 Cache API - 단 20줄의 코드만 있으면 됩니다.이제 API를 이렇게 호출할 수 있습니다. If there is a cache value of the current api call then it will return values from cache otherwis...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.