public static Serializable diff(Object[] a, Object[] b) { List<Object> la = Arrays.asList(a); List<Object> lb = Arrays.asList(b); Serializable diff = diff(la, lb); if (diff instanceof List) { return b; } ListDiff listDiff = (ListDiff) diff; listDiff.isArray = true; return listDiff; }
/** * Does a diff of two values. * * @return a {@link StateDiff}, a {@link ListDiff}, {@link #NOP}, or an actual value (including {@code null}) */ public static Serializable diff(Object a, Object b) { if (equalsLoose(a, b)) { return NOP; } if (a instanceof Object[] && b instanceof Object[]) { return diff((Object[]) a, (Object[]) b); } if (a instanceof List && b instanceof List) { @SuppressWarnings("unchecked") List<Object> la = (List<Object>) a; @SuppressWarnings("unchecked") List<Object> lb = (List<Object>) b; return (Serializable) diff(la, lb); } if (a instanceof State && b instanceof State) { StateDiff diff = diff((State) a, (State) b); return diff.isEmpty() ? NOP : diff; } return (Serializable) b; }
int diffs = 0; for (int i = 0; i < len; i++) { Serializable elemDiff = diff(a.get(i), b.get(i)); if (elemDiff == NOP) { nops++;
} else { Serializable elemDiff = diff(va, vb); if (elemDiff != NOP) { if (elemDiff instanceof Delta) {