An object with a function to create a next-generation instance specialized for environmental changes. I feel like it's just a pilot code for Generics and Lambda.
This is a memo.
Create a superclass O that can have the corresponding function if inherited.
package premodial;
import java.util.Arrays;
import java.util.Collection;
import java.util.function.BiFunction;
import java.util.function.Function;
/**
 * Origin
 * @author dev_user
 *
 */
public abstract class O <DATA extends Object, SELF extends O<DATA, ?>>{
	/*
	 * DATA is Origin's parameter.
	 */
	private final DATA data;
	protected O(final DATA d){
		this.data = d;
	}
	public final DATA getData(){
		return data;
	}
	public abstract SELF instance(final DATA d);
	public final O<?, ?> cloneInstance(){
		return instance(data);
	}
	/*
	 * childs is Origin's childs. Childs have generation.
	 */
	protected O<?, ?> parent = null;
	protected final Collection<O<?, ?>> childs = childsCollection();
	public abstract Collection<O<?, ?>> childsCollection();
	public final void addChild(final O<?, ?> child){
		child.parent = this;
		childs.add(child);
	}
	@SafeVarargs
	public final void addChilds(final O<?, ?>...childs){
		Arrays.stream(childs).forEach(c -> addChild(c));
	}
	public final Collection<O<?, ?>> getChilds(){
		final Collection<O<?, ?>> collection = childsCollection();
		childs.stream().forEach(c -> collection.add(c));
		return collection;
	}
	public final int getChildsSize(){
		return childs.size();
	}
	@SafeVarargs
	public final void addGenerations(final O<?, ?>...generations){
		O<?, ?> o = this;
		for(O<?, ?> g : generations){
			o.addChild(g);
			o = g;
		}
	}
	public final O<?, ?> getFirstGeneration(){
		return getFirstGeneration(parent);
	}
	private static O<?, ?> getFirstGeneration(final O<?, ?> parent) {
		/*Recursive version
		if(parent == null){
			return null;
		}
		if(parent.parent == null){
			return parent;
		}
		return getFirstGeneration(parent.parent);
		*/
		O<?, ?> p = parent;
		while(true){
			O<?, ?> now = p;
			p = p.parent;
			if(p == null){
				return now;
			}
		}
	}
	/*
	 * Origin can create self clone, of another instance.
	 * Origin can create new self by other data in environmental.
	 * Origin can create self child(inheritance).
	 */
	public final SELF replicate(){
		final SELF o = instance(data);
		for(final O<?, ?> child : childs){
			o.addChild(child.replicate());
		}
		return o;
		/*If the number of recursion is large, it will drop due to memory over, so it will be rewritten to a form other than recursion
		SELF o = instance(data);
		Collection<O<?, ?>> childCollection = childs;
		for(final O<?, ?> child : childCollection){
			final O<?, ?> newChild = child.cloneInstance();
			o.addChild(newChild);
			if(child.childs.isEmpty()){
				continue;
			}
		}
		return o;
		*/
	}
	public final SELF evolution(final Function<DATA, DATA> environmental){
		return instance(environmental.apply(data));
	}
	@SuppressWarnings("unchecked")
	public final SELF evolution(final BiFunction<DATA, DATA, DATA> environmental){
		return instance(environmental.apply(parent != null ? (DATA)parent.data : null, data));
	}
	public final SELF inheritance(){
		final SELF child = instance(data);
		addChild(child);
		return child;
	}
	public final SELF inheritance(final Function<DATA, DATA> environmental){
		final SELF child = evolution(environmental);
		addChild(child);
		return child;
	}
	public final SELF inheritance(final BiFunction<DATA, DATA, DATA> environmental){
		final SELF child = evolution(environmental);
		addChild(child);
		return child;
	}
	public final void print(){
		System.out.println(data.toString() + ", data_hashCode=" + data.hashCode() + ", o_hashCode=" + hashCode() + ", childs=" + getChildsSize());
	}
	protected Function<DATA, DATA> environmentalMemory = null;
	public final void memoryEnvironmental(final Function<DATA, DATA> environmentalMemory){
		this.environmentalMemory = environmentalMemory;
	}
	public final SELF nextGeneration(){
		final SELF g = instance(environmentalMemory != null ? environmentalMemory.apply(data) : data);
		g.environmentalMemory = environmentalMemory;
		addChild(g);
		return g;
	}
}
An object that handles long, inheriting O.
package premodial;
import java.util.ArrayList;
import java.util.Collection;
public final class OLong extends O<Long, OLong>{
	protected OLong(Long d){
		super(d);
	}
	@Override
	public OLong instance(Long d){
		return of(d);
	}
	public static OLong of(Long i){
		return new OLong(i);
	}
	@Override
	public Collection<O<?, ?>> childsCollection(){
		return new ArrayList<O<?, ?>>();
	}
}
Calculate the Fibonacci sequence using O Long.
		System.out.println("fibonacci------------");
		final BiFunction<Long, Long, Long> fibonacciCalc = (p, c) -> {
			if(p == null){
				return 0l;
			}else if(p == 0){
				return 1l;
			}else{
				return p + c;
			}
		};
		long start = System.currentTimeMillis();
		OLong fibonacci = OLong.of(0l);
		OLong fibonacciFirst = fibonacci;
		int fibonacciLoop = 20;
		for(int i = 0; i < fibonacciLoop; i++){
			fibonacci = fibonacci.inheritance(fibonacciCalc);
			System.out.println(fibonacci.getData().toString() + ", o_HashCode=" + fibonacci.hashCode());
		}
		System.out.println((System.currentTimeMillis() - start) + "ms");
		System.out.println("fibonacci(simple)----");
		start = System.currentTimeMillis();
		long a = 0;
		System.out.println(a);
		long b = 1;
		System.out.println(b);
		for(int i = 0; i < (fibonacciLoop - 2); i++){
			long c = a + b;
			System.out.println(c);
			a = b;
			b = c;
		}
		System.out.println((System.currentTimeMillis() - start) + "ms");
		System.out.println("fibonacci childs-----");
		printChilds(fibonacciFirst, true);
		start = System.currentTimeMillis();
		OLong fibonacciReplicated = fibonacciFirst.replicate();
		System.out.println((System.currentTimeMillis() - start) + "ms");
		printChilds(fibonacciReplicated, true);
Execution result.
fibonacci------------
0, o_HashCode=1190900417
1, o_HashCode=379110473
1, o_HashCode=99550389
2, o_HashCode=1598924227
3, o_HashCode=1144748369
5, o_HashCode=340870931
8, o_HashCode=1768305536
13, o_HashCode=1530388690
21, o_HashCode=1146743572
34, o_HashCode=1512981843
55, o_HashCode=42768293
89, o_HashCode=1717159510
144, o_HashCode=1834188994
233, o_HashCode=1174361318
377, o_HashCode=589873731
610, o_HashCode=200006406
987, o_HashCode=2052001577
1597, o_HashCode=1160264930
2584, o_HashCode=544724190
4181, o_HashCode=1972439101
4ms
fibonacci(simple)----
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
1ms
fibonacci childs-----
0, data_hashCode=0, o_hashCode=2007328737, childs=1
0, data_hashCode=0, o_hashCode=1190900417, childs=1
1, data_hashCode=1, o_hashCode=379110473, childs=1
1, data_hashCode=1, o_hashCode=99550389, childs=1
2, data_hashCode=2, o_hashCode=1598924227, childs=1
3, data_hashCode=3, o_hashCode=1144748369, childs=1
5, data_hashCode=5, o_hashCode=340870931, childs=1
8, data_hashCode=8, o_hashCode=1768305536, childs=1
13, data_hashCode=13, o_hashCode=1530388690, childs=1
21, data_hashCode=21, o_hashCode=1146743572, childs=1
34, data_hashCode=34, o_hashCode=1512981843, childs=1
55, data_hashCode=55, o_hashCode=42768293, childs=1
89, data_hashCode=89, o_hashCode=1717159510, childs=1
144, data_hashCode=144, o_hashCode=1834188994, childs=1
233, data_hashCode=233, o_hashCode=1174361318, childs=1
377, data_hashCode=377, o_hashCode=589873731, childs=1
610, data_hashCode=610, o_hashCode=200006406, childs=1
987, data_hashCode=987, o_hashCode=2052001577, childs=1
1597, data_hashCode=1597, o_hashCode=1160264930, childs=1
2584, data_hashCode=2584, o_hashCode=544724190, childs=1
4181, data_hashCode=4181, o_hashCode=1972439101, childs=0
0ms
0, data_hashCode=0, o_hashCode=1936628443, childs=1
0, data_hashCode=0, o_hashCode=1830908236, childs=1
1, data_hashCode=1, o_hashCode=277630005, childs=1
1, data_hashCode=1, o_hashCode=1288354730, childs=1
2, data_hashCode=2, o_hashCode=1274370218, childs=1
3, data_hashCode=3, o_hashCode=758705033, childs=1
5, data_hashCode=5, o_hashCode=1604839423, childs=1
8, data_hashCode=8, o_hashCode=1177096266, childs=1
13, data_hashCode=13, o_hashCode=670576685, childs=1
21, data_hashCode=21, o_hashCode=1299641336, childs=1
34, data_hashCode=34, o_hashCode=764308918, childs=1
55, data_hashCode=55, o_hashCode=598446861, childs=1
89, data_hashCode=89, o_hashCode=1161082381, childs=1
144, data_hashCode=144, o_hashCode=1067938912, childs=1
233, data_hashCode=233, o_hashCode=1637506559, childs=1
377, data_hashCode=377, o_hashCode=517380410, childs=1
610, data_hashCode=610, o_hashCode=2117255219, childs=1
987, data_hashCode=987, o_hashCode=2058534881, childs=1
1597, data_hashCode=1597, o_hashCode=1232367853, childs=1
2584, data_hashCode=2584, o_hashCode=1673605040, childs=1
4181, data_hashCode=4181, o_hashCode=186276003, childs=0
        Recommended Posts