/** * @param a * @param b * @return */ public static <T1, T2, L extends List<? super T1>, R extends List<? super T2>> Difference<L, R> of(Collection<T1> a, Collection<T2> b) { List<T1> common = new ArrayList<>(); List<T1> leftOnly = new ArrayList<>(); List<T2> rightOnly = new ArrayList<>(); if (N.isNullOrEmpty(a)) { if (N.isNullOrEmpty(b)) { // Do nothing. All empty. } else { rightOnly.addAll(b); } } else if (N.isNullOrEmpty(b)) { leftOnly.addAll(a); } else { common = N.intersect(a, b); leftOnly = N.except(a, b); rightOnly = N.except(b, a); } return new Difference<>((L) common, (L) leftOnly, (R) rightOnly); }