fix checkstyle errors

This commit is contained in:
tigraboris 2018-01-20 21:42:14 +03:00
parent f7825f6c99
commit 4c4cbd41cf
3 changed files with 91 additions and 82 deletions

View File

@ -2,83 +2,84 @@ package com.iluwatar.trampoline;
import java.util.stream.Stream;
/**<p>Trampoline pattern allows to define recursive algorithms by iterative loop </p>
/**
* <p>Trampoline pattern allows to define recursive algorithms by iterative loop </p>
* <p>When get is called on the returned Trampoline, internally it will iterate calling jump
on the returned Trampoline as long as the concrete instance returned is {@link #more(Trampoline)},
stopping once the returned instance is {@link #done(Object)}.</p>
<p>Essential we convert looping via recursion into iteration,
the key enabling mechanism is the fact that {@link #more(Trampoline)} is a lazy operation.</p>
*/
public interface Trampoline<T> {
T get();
* on the returned Trampoline as long as the concrete instance returned is {@link #more(Trampoline)},
* stopping once the returned instance is {@link #done(Object)}.</p>
* <p>Essential we convert looping via recursion into iteration,
* the key enabling mechanism is the fact that {@link #more(Trampoline)} is a lazy operation.</p>
*
* @param <T> is type for returning result.
*/
public interface Trampoline<T> {
T get();
/**
* @return next stage
*/
default Trampoline<T> jump() {
return this;
}
/**
* @return next stage
*/
default Trampoline<T> jump() {
return this;
}
default T result() {
return get();
}
default T result() {
return get();
}
/**
* @return true if complete
*
*/
default boolean complete() {
return true;
}
/**
* @return true if complete
*/
default boolean complete() {
return true;
}
/**
* Created a completed Trampoline
*
* @param result Completed result
* @return Completed Trampoline
*/
static <T> Trampoline<T> done(final T result) {
return () -> result;
}
/**
* Created a completed Trampoline
*
* @param result Completed result
* @return Completed Trampoline
*/
static <T> Trampoline<T> done(final T result) {
return () -> result;
}
/**
* Create a Trampoline that has more work to do
*
* @param trampoline Next stage in Trampoline
* @return Trampoline with more work
*/
static <T> Trampoline<T> more(final Trampoline<Trampoline<T>> trampoline) {
return new Trampoline<T>() {
@Override
public boolean complete() {
return false;
}
/**
* Create a Trampoline that has more work to do
*
* @param trampoline Next stage in Trampoline
* @return Trampoline with more work
*/
static <T> Trampoline<T> more(final Trampoline<Trampoline<T>> trampoline) {
return new Trampoline<T>() {
@Override
public boolean complete() {
return false;
}
@Override
public Trampoline<T> jump() {
return trampoline.result();
}
@Override
public Trampoline<T> jump() {
return trampoline.result();
}
@Override
public T get() {
return trampoline(this);
}
@Override
public T get() {
return trampoline(this);
}
T trampoline(final Trampoline<T> trampoline) {
T trampoline(final Trampoline<T> trampoline) {
return Stream.iterate(trampoline, Trampoline::jump)
.filter(Trampoline::complete)
.findFirst()
.get()
.result();
return Stream.iterate(trampoline, Trampoline::jump)
.filter(Trampoline::complete)
.findFirst()
.get()
.result();
}
};
}
}
};
}
}

View File

@ -31,24 +31,28 @@ import lombok.extern.slf4j.Slf4j;
* <p>it is possible to implement algorithms recursively in Java without blowing the stack
* and to interleave the execution of functions without hard coding them together or even using threads.</p>
*/
@Slf4j
public class TrampolineApp {
public static void main(String[] args) {
log.info("start pattern");
Integer result = loop(10, 1).result();
log.info("result {}", result);
}
/**
* Main program for showing pattern. It does loop with factorial function.
* */
public static void main(String[] args) {
log.info("start pattern");
Integer result = loop(10, 1).result();
log.info("result {}", result);
/**
* Manager for pattern. Define it with a factorial function.
* */
public static Trampoline<Integer> loop(int times, int prod) {
if (times == 0)
return Trampoline.done(prod);
else
return Trampoline.more(() -> loop(times - 1, prod * times));
}
/**
* Manager for pattern. Define it with a factorial function.
*/
public static Trampoline<Integer> loop(int times, int prod) {
if (times == 0) {
return Trampoline.done(prod);
} else {
return Trampoline.more(() -> loop(times - 1, prod * times));
}
}
}

View File

@ -6,13 +6,17 @@ import java.io.IOException;
import static org.junit.Assert.*;
/**
* Test for trampoline pattern.
* */
public class TrampolineAppTest {
@Test
public void testTrampolineWithFactorialFunction()throws IOException{
int result = TrampolineApp.loop(10, 1).result();
assertEquals("Be equal",3628800,result);
}
@Test
public void testTrampolineWithFactorialFunction() throws IOException {
int result = TrampolineApp.loop(10, 1).result();
assertEquals("Be equal", 3628800, result);
}
}