[JAVA] Source of cellular objects

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

Source of cellular objects
I read the source of ArrayList I read
Sort a List of Java objects
I read the source of Integer
I read the source of Long
I read the source of Short
I read the source of Byte
I read the source of String
Basic structure of Java source code
Explanation of Ruby Time and Date objects
Easily measure the size of Java Objects
Comparison of JavaScript objects and Ruby classes