Lists { public static <X> List<X> distinct(List<X> inputs) { if (null == inputs) { return null; } return foldLeft(new ArrayList<X>(), inputs, new Aggregator<X, List<X>>() { private Set<X> mSeen = new HashSet<X>(); @Override public List<X> eval(X input, List<X> out) { if (!mSeen.contains(input)) { out.add(input); mSeen.add(input); } return out; } }); } private  Lists(); static Y foldLeft(Y initial, List<X> inputList, Aggregator<? super X, Y> op); static Y foldRight(Y initial, List<X> inputList, Aggregator<? super X, Y> op); static List<Y> map(List<X> inputs, Func<? super X, ? extends Y> mapper); @SuppressWarnings("unchecked") static X[] toArray(List<X> inputs, Class<X> klazz); static List<X> distinct(List<X> inputs);  }
@Test public void testDistinct() { List<String> inputs = new ArrayList<String>(); inputs.add("a"); inputs.add("b"); inputs.add("a"); inputs.add("a"); List<String> outputs = new ArrayList<String>(); outputs.add("a"); outputs.add("b"); assertTrue(outputs.equals(Lists.distinct(inputs))); }
@Test public void testDistinct2() { List<String> inputs = new ArrayList<String>(); inputs.add("b"); inputs.add("a"); inputs.add("a"); inputs.add("a"); List<String> outputs = new ArrayList<String>(); outputs.add("b"); outputs.add("a"); assertTrue(outputs.equals(Lists.distinct(inputs))); }
@Test public void testDistinct3() { List<String> inputs = new ArrayList<String>(); inputs.add("a"); inputs.add("b"); inputs.add("c"); assertTrue(inputs.equals(Lists.distinct(inputs))); inputs.clear(); assertTrue(inputs.equals(Lists.distinct(inputs))); }
@Test public void testDistinctNulls() { List<String> inputs = new ArrayList<String>(); inputs.add("b"); inputs.add(null); inputs.add(null); inputs.add("a"); List<String> outputs = new ArrayList<String>(); outputs.add("b"); outputs.add(null); outputs.add("a"); assertTrue(outputs.equals(Lists.distinct(inputs))); }