package com.github.java8.lambdasinaction.chap14; public class PersistentTree { public static void main(String[] args) { Tree t = new Tree("Mary", 22, new Tree("Emily", 20, new Tree("Alan", 50, null, null), new Tree("Georgie", 23, null, null) ), new Tree("Tian", 29, new Tree("Raoul", 23, null, null), null ) ); // found = 23 System.out.println(lookup("Raoul", -1, t)); // not found = -1 System.out.println(lookup("Jeff", -1, t)); Tree f = fupdate("Jeff", 80, t); // found = 80 System.out.println(lookup("Jeff", -1, f)); Tree u = update("Jim", 40, t); // t was not altered by fupdate, so Jeff is not found = -1 System.out.println(lookup("Jeff", -1, u)); // found = 40 System.out.println(lookup("Jim", -1, u)); Tree f2 = fupdate("Jeff", 80, t); // found = 80 System.out.println(lookup("Jeff", -1, f2)); // f2 built from t altered by update() above, so Jim is still present = 40 System.out.println(lookup("Jim", -1, f2)); } static class Tree { private String key; private int val; private Tree left, right; public Tree(String k, int v, Tree l, Tree r) { key = k; val = v; left = l; right = r; } } public static int lookup(String k, int defaultval, Tree t) { if (t == null) return defaultval; if (k.equals(t.key)) return t.val; return lookup(k, defaultval, k.compareTo(t.key) < 0 ? t.left : t.right); } public static Tree update(String k, int newval, Tree t) { if (t == null) t = new Tree(k, newval, null, null); else if (k.equals(t.key)) t.val = newval; else if (k.compareTo(t.key) < 0) t.left = update(k, newval, t.left); else t.right = update(k, newval, t.right); return t; } public static Tree fupdate(String k, int newval, Tree t) { return (t == null) ? new Tree(k, newval, null, null) : k.equals(t.key) ? new Tree(k, newval, t.left, t.right) : k.compareTo(t.key) < 0 ? new Tree(t.key, t.val, fupdate(k,newval, t.left), t.right) : new Tree(t.key, t.val, t.left, fupdate(k,newval, t.right)); } }