Skip to content

Commit 1411714

Browse files
committed
https://jira.baeldung.com/browse/BAEL-7787
1 parent 7f87e88 commit 1411714

File tree

11 files changed

+215
-0
lines changed

11 files changed

+215
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.baeldung.memoization;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
public class FibonacciMemoization {
10+
11+
private static final Map<Integer, Long> cache = new HashMap<>();
12+
private static Logger logger = LoggerFactory.getLogger(FibonacciMemoization.class);
13+
14+
static long fibonacci(int n) {
15+
if (n <= 1) {
16+
return n;
17+
}
18+
19+
if (cache.containsKey(n)) {
20+
return cache.get(n);
21+
}
22+
23+
long result = fibonacci(n - 1) + fibonacci(n - 2);
24+
logger.info("First occurrence of " + n);
25+
cache.put(n, result);
26+
27+
return result;
28+
}
29+
30+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.baeldung.memoization;
2+
3+
import org.springframework.web.reactive.function.client.WebClient;
4+
import reactor.core.publisher.Mono;
5+
6+
import java.io.IOException;
7+
import java.time.Duration;
8+
import java.util.concurrent.atomic.AtomicInteger;
9+
10+
public class MemoizationWithMonoCache {
11+
12+
static WebClient client = WebClient.create("https://jsonplaceholder.typicode.com/users");
13+
14+
static AtomicInteger counter = new AtomicInteger(0);
15+
16+
static Mono<User> retrieveOneUser(int id) {
17+
return client.get()
18+
.uri("/{id}", id)
19+
.retrieve()
20+
.bodyToMono(User.class)
21+
.doOnSubscribe(i -> counter.incrementAndGet())
22+
.onErrorResume(Mono::error);
23+
}
24+
25+
int getCounter() {
26+
return counter.get();
27+
}
28+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.baeldung.memoization;
2+
3+
public class User {
4+
private int id;
5+
private String name;
6+
7+
public User() {
8+
}
9+
10+
public User(int id, String name) {
11+
this.id = id;
12+
this.name = name;
13+
}
14+
15+
public int getId() {
16+
return id;
17+
}
18+
19+
public void setId(int id) {
20+
this.id = id;
21+
}
22+
23+
public String getName() {
24+
return name;
25+
}
26+
27+
public void setName(String name) {
28+
this.name = name;
29+
}
30+
31+
@Override
32+
public String toString() {
33+
return "User{" + "id=" + id + ", name='" + name + '\'' + '}';
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.baeldung.memoization;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import static org.junit.jupiter.api.Assertions.assertEquals;
6+
7+
class FibonacciMemoizationUnitTest {
8+
9+
@Test
10+
void givenFibonacciNumber_whenFirstOccurenceIscache_thenReturnCacheResultOnSecondCall() {
11+
12+
assertEquals(5, FibonacciMemoization.fibonacci(5));
13+
assertEquals(2, FibonacciMemoization.fibonacci(3));
14+
assertEquals(55, FibonacciMemoization.fibonacci(10));
15+
assertEquals(21, FibonacciMemoization.fibonacci(8));
16+
}
17+
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.baeldung.memoization;
2+
3+
import org.junit.jupiter.api.Test;
4+
import reactor.core.Disposable;
5+
import reactor.core.publisher.Mono;
6+
import reactor.test.StepVerifier;
7+
8+
import java.util.concurrent.atomic.AtomicReference;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
12+
class MemoizationWithMonoCacheUnitTest {
13+
14+
@Test
15+
void givenRetrievedUser_whenTheCallToRemoteIsCache_thenReturnInvocationCountAndCompareResult() {
16+
17+
MemoizationWithMonoCache memoizationWithMonoCache = new MemoizationWithMonoCache();
18+
19+
Mono<User> userCall = MemoizationWithMonoCache.retrieveOneUser(1)
20+
.cache();
21+
AtomicReference<User> firstUser = new AtomicReference<>();
22+
AtomicReference<User> secondUser = new AtomicReference<>();
23+
24+
Disposable firstUserCall = userCall.map(user -> {
25+
firstUser.set(user);
26+
return user.getName();
27+
})
28+
.subscribe();
29+
30+
Disposable secondUserCall = userCall.map(user -> {
31+
secondUser.set(user);
32+
return user.getName();
33+
})
34+
.subscribe();
35+
36+
assertEquals(1, memoizationWithMonoCache.getCounter());
37+
assertEquals(firstUser.get(), secondUser.get());
38+
39+
}
40+
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.baeldung.memoization;
2+
3+
import com.baeldung.webclientretrievevsexchange.User;
4+
import org.openjdk.jmh.annotations.*;
5+
import org.springframework.web.reactive.function.client.WebClient;
6+
import reactor.core.publisher.Mono;
7+
8+
import java.util.concurrent.TimeUnit;
9+
10+
@State(Scope.Benchmark)
11+
@BenchmarkMode(Mode.AverageTime)
12+
@Warmup(iterations = 3, time = 10, timeUnit = TimeUnit.MICROSECONDS)
13+
@Measurement(iterations = 3, time = 10, timeUnit = TimeUnit.MICROSECONDS)
14+
public class RetrieveAndExchangeBenchmark {
15+
private WebClient client;
16+
17+
@Setup
18+
public void setup() {
19+
this.client = WebClient.create("https://jsonplaceholder.typicode.com/users");
20+
}
21+
22+
@Benchmark
23+
public Mono<User> retrieveOneUserUsingRetrieveMethod() {
24+
return client.get()
25+
.uri("/1")
26+
.retrieve()
27+
.bodyToMono(com.baeldung.webclientretrievevsexchange.User.class)
28+
.onErrorResume(Mono::error);
29+
}
30+
31+
@Benchmark
32+
public Mono<User> retrieveOneUserUsingRetrieveMethodCache() {
33+
Mono<User> cal = retrieveOneUserUsingRetrieveMethod().cache();
34+
Mono<User> cal2 = retrieveOneUserUsingRetrieveMethod().cache();
35+
return cal2;
36+
}
37+
38+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.baeldung.memoization;
2+
3+
public class FibonacciMemoization {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.baeldung.memoization;
2+
3+
public class MemoizationWithMonoCache {
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.baeldung.memoization;
2+
3+
public class User {
4+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.baeldung.memoization;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
5+
class FibonacciMemoizationUnitTest {
6+
7+
}

0 commit comments

Comments
 (0)