mirror of
https://github.com/sigmasternchen/fibonacci
synced 2025-03-15 08:08:58 +00:00
add java version
This commit is contained in:
parent
9cdc05b70e
commit
0363c0a329
9 changed files with 226 additions and 0 deletions
33
java/business/AbstractFibonacciSequence.java
Normal file
33
java/business/AbstractFibonacciSequence.java
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public abstract class AbstractFibonacciSequence<T> extends RecursiveSeqeunce<T> {
|
||||||
|
private List<T> startValues = new ArrayList<>(2);
|
||||||
|
|
||||||
|
protected abstract T add(T v1, T v2);
|
||||||
|
|
||||||
|
public AbstractFibonacciSequence(T value1, T value2) {
|
||||||
|
startValues.add(value1);
|
||||||
|
startValues.add(value2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<T> getInitialState() {
|
||||||
|
return new ArrayList<>(startValues);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected T getNext(List<T> last) {
|
||||||
|
return this.add(last.get(0), last.get(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Consumer<T> prettyPrintConsumer(PrintStream stream, String format) {
|
||||||
|
return RecursiveSeqeunce.accumulatedConsumer(3, l -> {
|
||||||
|
stream.printf(format, l.get(0), l.get(1), l.get(2));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
27
java/business/Couple.java
Normal file
27
java/business/Couple.java
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
public class Couple<T1, T2> {
|
||||||
|
private T1 v1;
|
||||||
|
private T2 v2;
|
||||||
|
|
||||||
|
public Couple(T1 v1, T2 v2) {
|
||||||
|
this.v1 = v1;
|
||||||
|
this.v2 = v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T1 getV1() {
|
||||||
|
return v1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setV1(T1 v1) {
|
||||||
|
this.v1 = v1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T2 getV2() {
|
||||||
|
return v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setV2(T2 v2) {
|
||||||
|
this.v2 = v2;
|
||||||
|
}
|
||||||
|
}
|
18
java/business/FibonacciBusinessApplication.java
Normal file
18
java/business/FibonacciBusinessApplication.java
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
public class FibonacciBusinessApplication {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.printf("Result: %d\n",
|
||||||
|
new IntegerFibonacciSequence(1, 1)
|
||||||
|
.stream()
|
||||||
|
.limit(5)
|
||||||
|
.peek(
|
||||||
|
AbstractFibonacciSequence.prettyPrintConsumer(
|
||||||
|
System.out,
|
||||||
|
"%d + %d = %d\n"
|
||||||
|
)
|
||||||
|
).mapToInt(Integer::intValue)
|
||||||
|
.max()
|
||||||
|
.getAsInt());
|
||||||
|
}
|
||||||
|
}
|
12
java/business/IntegerFibonacciSequence.java
Normal file
12
java/business/IntegerFibonacciSequence.java
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
public class IntegerFibonacciSequence extends AbstractFibonacciSequence<Integer> {
|
||||||
|
@Override
|
||||||
|
protected Integer add(Integer v1, Integer v2) {
|
||||||
|
return v1 + v2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IntegerFibonacciSequence(Integer value1, Integer value2) {
|
||||||
|
super(value1, value2);
|
||||||
|
}
|
||||||
|
}
|
49
java/business/RecursiveSeqeunce.java
Normal file
49
java/business/RecursiveSeqeunce.java
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public abstract class RecursiveSeqeunce<T> implements Sequence<T> {
|
||||||
|
|
||||||
|
protected abstract List<T> getInitialState();
|
||||||
|
protected abstract T getNext(List<T> last);
|
||||||
|
|
||||||
|
private T supplierGetter(Couple<Integer, List<T>> _state) {
|
||||||
|
List<T> state = _state.getV2();
|
||||||
|
int size = state.size();
|
||||||
|
int index = _state.getV1();
|
||||||
|
|
||||||
|
_state.setV1(index + 1);
|
||||||
|
|
||||||
|
if (index < size) {
|
||||||
|
return state.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
T value = getNext(state);
|
||||||
|
|
||||||
|
state.remove(0);
|
||||||
|
state.add(value);
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Stream<T> stream() {
|
||||||
|
return Stream.generate(StatefulSupplier.get(new Couple<>(0, getInitialState()), this::supplierGetter));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> Consumer<T> accumulatedConsumer(int recursionLength, Consumer<List<T>> consumer) {
|
||||||
|
return StatefulConsumer.get(new ArrayList<T>(recursionLength), (l, o) -> {
|
||||||
|
if (l.size() >= recursionLength) {
|
||||||
|
l.remove(0);
|
||||||
|
}
|
||||||
|
l.add(o);
|
||||||
|
|
||||||
|
if (l.size() >= recursionLength) {
|
||||||
|
consumer.accept(l);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
7
java/business/Sequence.java
Normal file
7
java/business/Sequence.java
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public interface Sequence<T> {
|
||||||
|
Stream<T> stream();
|
||||||
|
}
|
32
java/business/StatefulConsumer.java
Normal file
32
java/business/StatefulConsumer.java
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public interface StatefulConsumer<S, T> extends Consumer<T> {
|
||||||
|
class StatefulConsumerImpl<S, T> implements StatefulConsumer<S, T> {
|
||||||
|
private S state;
|
||||||
|
private BiConsumer<S, T> consumer;
|
||||||
|
|
||||||
|
private StatefulConsumerImpl(S state, BiConsumer<S, T> consumer) {
|
||||||
|
this.state = state;
|
||||||
|
this.consumer = consumer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(S state, T value) {
|
||||||
|
consumer.accept(state, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void accept(T t) {
|
||||||
|
accept(state, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void accept(S state, T value);
|
||||||
|
|
||||||
|
static <S, T> StatefulConsumer<S, T> get(S state, BiConsumer<S, T> consumer) {
|
||||||
|
return new StatefulConsumerImpl<>(state, consumer);
|
||||||
|
}
|
||||||
|
}
|
31
java/business/StatefulSupplier.java
Normal file
31
java/business/StatefulSupplier.java
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package business;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
public interface StatefulSupplier<S, T> extends Supplier<T> {
|
||||||
|
class StatefulSupplierImpl<S, T> implements StatefulSupplier<S, T> {
|
||||||
|
private S state;
|
||||||
|
private Function<S, T> getter;
|
||||||
|
|
||||||
|
private StatefulSupplierImpl(S state, Function<S, T> getter) {
|
||||||
|
this.state = state;
|
||||||
|
this.getter = getter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T get(S s) {
|
||||||
|
return getter.apply(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T get() {
|
||||||
|
return get(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
T get(S s);
|
||||||
|
|
||||||
|
static <S, T> StatefulSupplier<S, T> get(S state, Function<S, T> getter) {
|
||||||
|
return new StatefulSupplierImpl<>(state, getter);
|
||||||
|
}
|
||||||
|
}
|
17
java/minimal-loop-less/Fibonacci.java
Normal file
17
java/minimal-loop-less/Fibonacci.java
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
public class Fibonacci {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.printf("Result: %d\n",
|
||||||
|
Stream.iterate(
|
||||||
|
Map.entry(1, 1), e -> Map.entry(e.getValue(), e.getKey() + e.getValue())
|
||||||
|
).limit(args.length == 1 ? Integer.valueOf(args[0]) : 3
|
||||||
|
).peek(e -> System.out.printf("%d + %d = ", e.getKey(), e.getValue())
|
||||||
|
).mapToInt(e -> e.getKey() + e.getValue()
|
||||||
|
).peek(System.out::println
|
||||||
|
).max(
|
||||||
|
).getAsInt()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue