/*******************************************************************************
* Copyright (c) 2008 Ralf Ebert
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ralf Ebert - initial API and implementation
*******************************************************************************/
package com.swtxml.util.lang;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.swtxml.util.reflector.ReflectorException;
public class CollectionUtils {
/**
* Returns the first element from iterable for which filter.match(element)
* returned true.
*/
public static <A> A find(Iterable<? extends A> iterable, IFilter<A> filter) {
for (A a : iterable) {
if (filter.match(a)) {
return a;
}
}
return null;
}
/**
* Returns a new collection containing all elements from collection for
* which filter.match(element) returned true.
*/
@SuppressWarnings("unchecked")
public static <A> Collection<A> select(Collection<? extends A> collection, IFilter<A> filter) {
Collection<A> resultList = createCollection(collection);
for (A a : collection) {
if (filter.match(a)) {
resultList.add(a);
}
}
return resultList;
}
/**
* Returns a new collection containing the result from
* function.apply(element) for all elements from collection.
*/
@SuppressWarnings("unchecked")
public static <FROM, TO> Collection<TO> collect(Collection<? extends FROM> collection,
IFunction<FROM, TO> function) {
Collection<TO> resultList = createCollection(collection);
for (FROM a : collection) {
resultList.add(function.apply(a));
}
return resultList;
}
/**
* Returns a new list containing the result from function.apply(element) for
* all elements from list.
*/
public static <FROM, TO> List<TO> collect(List<? extends FROM> list,
IFunction<FROM, TO> function) {
List<TO> resultList = new ArrayList<TO>();
for (FROM a : list) {
resultList.add(function.apply(a));
}
return resultList;
}
/**
* Returns a comma-separated String of the collection toString values
* alphabetically sorted by value.
*/
public static String sortedToString(Collection<?> collection) {
List<String> strings = new ArrayList<String>(collect(collection, Functions.TO_STRING));
Collections.sort(strings);
return StringUtils.join(strings, ", ");
}
@SuppressWarnings("unchecked")
private static Collection createCollection(Collection original) {
if (original instanceof Set) {
return new HashSet();
}
if (original instanceof Collection) {
return new ArrayList();
}
throw new ReflectorException("Unknown collection type: " + original.getClass());
}
}