All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.jmkgreen.morphia.utils.IterHelper Maven / Gradle / Ivy

The newest version!
package com.github.jmkgreen.morphia.utils;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bson.BSONObject;

/**
 * Helper to allow for optimizations for different types of Map/Collections
 *
 * @param  The key type of the map
 * @param  The value type of the map/collection
 * @author Scott Hernandez
 */
public class IterHelper {
    @SuppressWarnings({"unchecked", "rawtypes"})
    public void loopMap(Object x, MapIterCallback iter) {
        if (x == null)
            return;

        if (x instanceof Collection)
            throw new IllegalArgumentException("call loop instead");

        if (x instanceof HashMap) {
            if (((HashMap) x).size() == 0)
                return;

            HashMap hm = (HashMap) x;
            for (Entry e : hm.entrySet())
                iter.eval((T) e.getKey(), (V) e.getValue());
            return;
        }
        if (x instanceof Map) {
            Map m = (Map) x;
            for (Object k : m.keySet())
                iter.eval((T) k, (V) m.get(k));
            return;
        }
        if (x instanceof BSONObject) {
            BSONObject m = (BSONObject) x;
            for (String k : m.keySet())
                iter.eval((T) k, (V) m.get(k));
            return;
        }

    }

    @SuppressWarnings({"unchecked"})
    public void loop(Object x, IterCallback iter) {
        if (x == null)
            return;

        if (x instanceof Map)
            throw new IllegalArgumentException("call loopMap instead");

        if (x instanceof List) {
            List l = (List) x;
            for (Object o : l)
                iter.eval((V) o);
        }
    }

    /**
     * Calls eval for each entry found, or just once if the "x" isn't iterable/collection/list/etc. with "x"
     *
     * @param x
     * @param iter
     */
    @SuppressWarnings({"unchecked"})
    public void loopOrSingle(Object x, IterCallback iter) {
        if (x == null)
            return;

        //A collection
        if (x instanceof Collection) {
            Collection l = (Collection) x;
            for (Object o : l)
                iter.eval((V) o);
            return;
        }

        //An array of Object[]
        if (x.getClass().isArray()) {
            for (Object o : (Object[]) x)
                iter.eval((V) o);
            return;
        }

        iter.eval((V) x);
    }

    public static abstract class MapIterCallback {
        public abstract void eval(T t, V v);
    }

    public static abstract class IterCallback {
        public abstract void eval(V v);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy