package org.ovirt.engine.core.utils.linq;
import java.util.*;
/**
* Created by IntelliJ IDEA. User: gmostizk Date: Aug 9, 2009 Time: 3:44:57 PM To change this template use File |
* Settings | File Templates.
*/
public class LinqUtils {
/**
* Replaces firstOrDefault() LINQ
*
* Returns first object from the collection that matches the predicate, or null if no such object was found
*/
public static <T> T firstOrNull(Collection<T> collection, Predicate<T> predicate) {
for (T t : collection) {
if (predicate.eval(t))
return t;
}
return null;
}
/**
* Replaces first() LINQ
*
* Returns first object of collection or null if empty
*/
public static <T> T first(Collection<T> collection) {
Iterator<T> iterator = collection.iterator();
if (iterator.hasNext())
return iterator.next();
else
return null;
}
/**
* Replaces LINQ's select()
*
* Returns a new list which contains all the objects from original collection with function applied to them.
*/
public static <IN, OUT> List<OUT> foreach(Collection<IN> collection, Function<IN, OUT> f) {
LinkedList<OUT> list = new LinkedList<OUT>();
for (IN in : collection) {
list.add(f.eval(in));
}
return list;
}
/**
* Replaces LINQ WHERE
*
* Returns list containing all objects from original collection that matches the predicate
*/
public static <T> List<T> filter(Collection<T> collection, Predicate<T> predicate) {
LinkedList<T> results = new LinkedList<T>();
for (T t : collection) {
if (predicate.eval(t))
results.add(t);
}
return results;
}
/**
* Replaces LINQ ToDictionary()
*
* Transforms given collection into map using mapper
* <p>
*
* See DefaultMapper if you want to map keys only (similar to single parameter toDictionary())
*/
public static <IN, KEY, VALUE> Map<KEY, VALUE> toMap(Collection<IN> collection, Mapper<IN, KEY, VALUE> mapper) {
Map<KEY, VALUE> map = new LinkedHashMap<KEY, VALUE>();
for (IN in : collection) {
map.put(mapper.createKey(in), mapper.createValue(in));
}
return map;
}
public static <VALUE> VALUE aggregate(Collection<VALUE> values, Aggregator<VALUE> aggregator) {
boolean first = true;
VALUE aggregate = null;
for (VALUE value : values) {
if (first) {
aggregate = value;
first = false;
} else {
aggregate = aggregator.process(aggregate, value);
}
}
return aggregate;
}
}