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

com.dtolabs.utils.Mapper Maven / Gradle / Ivy

There is a newer version: 5.6.0-20240912
Show newest version
/*
 * Copyright 2016 SimplifyOps, Inc. (http://simplifyops.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * Mapper.java
 *
 * Created on September 26, 2003, 4:30 PM
 * $Id: Mapper.java 9378 2009-08-06 18:59:53Z gschueler $
 */

package com.dtolabs.utils;


import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections.Predicate;

import java.util.*;


/**
 * Some basic functions from other languages just don't exist in java :) 
This utility class provides simple methods * for "mapping" a set of objects to a new set of objects, based on a provided implementation.
The mapping will be * one to one, although if the result of a particular mapping returns null, the result can be discarded (default) rather * than included.
Each static utility method which by default ignores null results has an equivalent method which * has a boolean parameter indicating whether nulls should be discarded or not.
The other use for this utility * class is to perform the same action on all items of a collection, where no result is necessarily returned or * important. *
* Example usage:
*
 * //create a collection of Strings from some objects
 * Collection c = Mapper.map(new Mapper(){
 *      public Object map(Object o){
 *          return o.toString();
 *      }, someIterator);
 * 
*
* //simply perform some action and discard the results * Mapper.map(new Mapper(){ * public Object map(Object o){ * ((MyTaskThread)o).performTask(); * return null; * }, someIterator); *
* * @author greg */ public abstract class Mapper { /** * Create a Comparator which compares two objects by first mapping * each object with a mapper and then comparing the result objects. * Note: The Mapper instance must map every object into one * that implements the {@link Comparable} interface, otherwise the two * objects cannot be compared. (All of the java.lang.* wrapper types will work.) * @param mapper mapper * @return comparator */ public static Comparator comparator(final Mapper mapper){ return comparator(mapper, false); } /** * see {@link #comparator(Mapper)} * @param mapper mapper * @param reverse if true, reverse the order of comparison * @return comparator */ public static Comparator comparator(final Mapper mapper, final boolean reverse){ return new Comparator(){ public int compare(Object o, Object o1) { return ((Comparable) mapper.map(reverse?o1:o)).compareTo(mapper.map(reverse?o:o1)); } }; } /** * Concatenate another mapper onto this one. * @param mapper mapper * @return mapper */ public Mapper concat(Mapper mapper){ return Mapper.concat(this, mapper); } private static class ConcatMapper extends Mapper{ private Mapper[] arr; ConcatMapper(Mapper[] maps){ this.arr = maps; } /** * Map one object to another. * * @return the new object. */ public Object map(Object a) { Object b = a; if (b == null) { return null; } if(null!=arr){ for (int i=0;i By default discards both key and value if either one is null. * * @param keys List of keys * @param values List of values * @return map */ public static Map zip(List keys, List values) { return zip(keys, values, false); } /** * Creates a map where the object at index N from the first List is the key for the object at index N of the second * List. If either List is shorter than the other, the resulting Map will have only as many keys as are in the * smallest of the two Lists.
If includeNull is true, both keys and values of null are allowed. Note that if * more than one key is null, previous entries will be overwritten. * * @param keys List of keys * @param values List of values * @param includeNull allow null values and keys * @return map */ public static Map zip(List keys, List values, boolean includeNull) { Iterator k = keys.iterator(); Iterator v = values.iterator(); HashMap hm = new HashMap(); while (k.hasNext() && v.hasNext()) { Object o = k.next(); Object p = v.next(); if (includeNull || o != null && p != null) { hm.put(o, p); } } return hm; } /** * Creates a map where the object at index N from the first Iterator is the key for the object at index N of the * second Iterator.
By default discards both key and value if either one is null. * * @param keys array of keys * @param values array of values * @return map */ public static Map zip(Object[] keys, Object[] values) { return zip(java.util.Arrays.asList(keys), java.util.Arrays.asList(values), false); } /** * Creates a map where the object at index N from the first Iterator is the key for the object at index N of the * second Iterator. If either Iterator is shorter than the other, the resulting Map will have only as many keys as * are in the smallest of the two Iterator.
If includeNull is true, both keys and values of null are allowed. * Note that if more than one key is null, previous entries will be overwritten. * * @param keys array of keys * @param values array of values * @param includeNull allow null values and keys * @return map */ public static Map zip(Object[] keys, Object[] values, boolean includeNull) { return zip(java.util.Arrays.asList(keys), java.util.Arrays.asList(values), includeNull); } /** * Creates a map where the object at index N from the first Iterator is the key for the object at index N of the * second Iterator.
By default discards both key and value if either one is null. * * @param keys Iterator of keys * @param values Iterator of values * @return map */ public static Map zip(Iterator keys, Iterator values) { return zip(keys, values, false); } /** * Creates a map where the object at index N from the first Iterator is the key for the object at index N of the * second Iterator. If either Iterator is shorter than the other, the resulting Map will have only as many keys as * are in the smallest of the two Iterator.
If includeNull is true, both keys and values of null are allowed. * Note that if more than one key is null, previous entries will be overwritten. * * @param keys Iterator of keys * @param values Iterator of values * @param includeNull allow null values and keys * @return map */ public static Map zip(Iterator keys, Iterator values, boolean includeNull) { HashMap hm = new HashMap(); while (keys.hasNext() && values.hasNext()) { Object o = keys.next(); Object p = values.next(); if (includeNull || o != null && p != null) { hm.put(o, p); } } return hm; } /** * Trivial case of a single object. * * @param mapper an Mapper * @param o an Object * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Object o) { return java.util.Collections.singleton(mapper.map(o)); } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param c a Collection * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Collection c) { return map(mapper, c, false); } public Collection apply(Collection c) { return Mapper.map(this, c); } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param c a Collection * @param allowNull allow null values * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Collection c, boolean allowNull) { return map(mapper, c.iterator(), allowNull); } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param arr an array of objects * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Object[] arr) { return map(mapper, arr, false); } public Collection apply(Object[] arr) { return Mapper.map(this, arr); } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param arr an array of objects * @param allowNull allow null values * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Object[] arr, boolean allowNull) { return map(mapper, java.util.Arrays.asList(arr), allowNull); } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param en an Enumeration * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Enumeration en) { return map(mapper, en, false); } public Collection apply(Enumeration en) { return Mapper.map(this, en); } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param en an Enumeration * @param allowNull allow null values * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Enumeration en, boolean allowNull) { ArrayList l = new ArrayList(); while (en.hasMoreElements()) { Object o = mapper.map(en.nextElement()); if (allowNull || o != null) { l.add(o); } } return l; } /** * Create a new Map by mapping all keys from the original map and maintaining the original value. * * @param mapper a Mapper to map the keys * @param map a Map * * @return a new Map with keys mapped */ public static Map mapKeys(Mapper mapper, Map map) { return mapKeys(mapper, map, false); } public Map applyToKeys(Map map) { return Mapper.mapKeys(this, map); } /** * Create a new Map by mapping all keys from the original map and maintaining the original value. * * @param mapper a Mapper to map the keys * @param map a Map * @param allowNull allow null values * * @return a new Map with keys mapped */ public static Map mapKeys(Mapper mapper, Map map, boolean allowNull) { HashMap h = new HashMap(); for (Object e : map.entrySet()) { Map.Entry entry = (Map.Entry) e; Object o = mapper.map(entry.getKey()); if (allowNull || o != null) { h.put(o, entry.getValue()); } } return h; } /** * Create a new Map by mapping all values from the original map and maintaining the original key. * * @param mapper a Mapper to map the values * @param map an Map * * @return a new Map with values mapped */ public static Map mapValues(Mapper mapper, Map map) { return mapValues(mapper, map, false); } public Map applyToValues(Map map) { return Mapper.mapValues(this, map); } /** * Create a new Map by mapping all values from the original map and maintaining the original key. * * @param mapper a Mapper to map the values * @param map an Map * @param includeNull true to include null * * @return a new Map with values mapped */ public static Map mapValues(Mapper mapper, Map map, boolean includeNull) { HashMap h = new HashMap(); for (Object e : map.keySet()) { Map.Entry entry = (Map.Entry) e; Object v = entry.getValue(); Object o = mapper.map(v); if (includeNull || o != null) { h.put(entry.getKey(), o); } } return h; } /** * Create a new Map by mapping all values from the original map and mapping all keys. * * @param mapper a Mapper to map the values and keys * @param map a Map * * @return a new Map with values mapped */ public static Map mapEntries(Mapper mapper, Map map) { return mapEntries(mapper, map, false); } public Map applyToEntries(Map map) { return Mapper.mapEntries(this, map); } /** * Create a new Map by mapping all values from the original map, and mapping all keys. * @param mapper a Mapper to map both values and keys * @param map Map input * @param includeNull if true, allow null as either key or value after mapping * @return a new Map with both keys and values mapped using the Mapper */ public static Map mapEntries(Mapper mapper, Map map, boolean includeNull){ HashMap h = new HashMap(); for (Object e : map.entrySet()) { Map.Entry entry = (Map.Entry) e; Object k = entry.getKey(); Object v = entry.getValue(); Object nk = mapper.map(k); Object o = mapper.map(v); if (includeNull || (o != null && nk != null)) { h.put(nk, o); } } return h; } /** * Create a new Map by using the array objects as keys, and the mapping result as values. Discard keys which return * null values from the mapper. * * @param mapper a Mapper to map the values * @param a array of items * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Object[] a) { return makeMap(mapper, java.util.Arrays.asList(a), false); } public Map makeMap(Object[] a) { return Mapper.makeMap(this, a); } /** * Create a new Map by using the array objects as keys, and the mapping result as values. * * @param mapper a Mapper to map the values * @param a array of items * @param includeNull true to include null * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Object[] a, boolean includeNull) { return makeMap(mapper, java.util.Arrays.asList(a), includeNull); } /** * Create a new Map by using the collection objects as keys, and the mapping result as values. Discard keys which * return null values from the mapper. * * @param mapper a Mapper to map the values * @param c Collection of items * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Collection c) { return makeMap(mapper, c.iterator(), false); } public Map makeMap(Collection c) { return Mapper.makeMap(this, c); } /** * Create a new Map by using the collection objects as keys, and the mapping result as values. * * @param mapper a Mapper to map the values * @param c Collection of items * @param includeNull true to include null * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Collection c, boolean includeNull) { return makeMap(mapper, c.iterator(), includeNull); } /** * Create a new Map by using the iterator objects as keys, and the mapping result as values. Discard keys which * return null values from the mapper. * * @param mapper a Mapper to map the values * @param i Iterator * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Iterator i) { return makeMap(mapper, i, false); } public Map makeMap(Iterator i) { return Mapper.makeMap(this, i); } /** * Create a new Map by using the iterator objects as keys, and the mapping result as values. * * @param mapper a Mapper to map the values * @param i Iterator * @param includeNull true to include null * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Iterator i, boolean includeNull) { HashMap h = new HashMap(); for (; i.hasNext();) { Object k = i.next(); Object v = mapper.map(k); if (includeNull || v != null) { h.put(k, v); } } return h; } /** * Create a new Map by using the enumeration objects as keys, and the mapping result as values. Discard keys which * return null values from the mapper. * * @param mapper a Mapper to map the values * @param en Enumeration * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Enumeration en) { return makeMap(mapper, en, false); } public Map makeMap(Enumeration en) { return Mapper.makeMap(this, en); } /** * Create a new Map by using the enumeration objects as keys, and the mapping result as values. * * @param mapper a Mapper to map the values * @param en Enumeration * @param includeNull true to include null * * @return a new Map with values mapped */ public static Map makeMap(Mapper mapper, Enumeration en, boolean includeNull) { HashMap h = new HashMap(); for (; en.hasMoreElements();) { Object k = en.nextElement(); Object v = mapper.map(k); if (includeNull || v != null) { h.put(k, v); } } return h; } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param i an Iterator * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Iterator i) { return map(mapper, i, false); } public Collection apply(Iterator i) { return Mapper.map(this, i); } /** * Return the results of mapping all objects with the mapper. * * @param mapper an Mapper * @param i an Iterator * @param includeNull specify whether nulls are included * * @return a Collection of the results. */ public static Collection map(Mapper mapper, Iterator i, boolean includeNull) { ArrayList l = new ArrayList(); while (i.hasNext()) { Object o = mapper.map(i.next()); if (includeNull || o != null) { l.add(o); } } return l; } /** * Map dynamically using a bean property name. * * @param property the name of a bean property * @param objs an array of objects * * @return collection * @throws ClassCastException if there is an error invoking the method on any object. */ public static Collection beanMap(String property, Object[] objs) { return beanMap(property, java.util.Arrays.asList(objs), false); } /** * Map dynamically using a bean property name. * * @param property the name of a bean property * @param i an iterator of objects * * @return collection * * @throws ClassCastException if there is an error invoking the method on any object. */ public static Collection beanMap(String property, Iterator i) { return beanMap(property, i, false); } /** * Map dynamically using a bean property name. * * @param property the name of a bean property * @param c an Collection of objects * @param includeNull true to include null results in the response * * @return collection * * @throws ClassCastException if there is an error invoking the method on any object. */ public static Collection beanMap(String property, Collection c, boolean includeNull) { return beanMap(property, c.iterator(), includeNull); } /** * Map dynamically using a bean property name. * * @param property the name of a bean property * @param c a collection of objects * * @return collection * * @throws ClassCastException if there is an error invoking the method on any object. */ public static Collection beanMap(String property, Collection c) { return beanMap(property, c.iterator(), false); } /** * Create a mapper for bean properties * @param property name of the bean property * @return mapper */ public static Mapper beanMapper(final String property){ return new Mapper() { public Object map(Object a) { try { return BeanUtils.getProperty(a, property); } catch (Exception e) { throw new ClassCastException("Object was not the expected class: " + a.getClass()); } } }; } /** * Map dynamically using a bean property name. * * @param property the name of a bean property * @param i an iterator of objects * @param includeNull true to include null results in the response * * @return collection * * @throws ClassCastException if there is an error invoking the method on any object. */ public static Collection beanMap(final String property, Iterator i, boolean includeNull) { return map(beanMapper(property), i, includeNull); } /** * Return a mapper than maps an object to itself if the predicate evaluates to true, * and to null otherwise. * @param pred predicate * @return mapper */ public static Mapper filterMapper(final Predicate pred){ return new Mapper(){ public Object map(Object a) { return pred.evaluate(a) ? a : null; } }; } /** * @return a mapper that maps unique objects to themselves, and duplicates to null. */ public static Mapper uniqueMapper(){ return new Mapper() { HashSet set = new HashSet(); public Object map(Object a) { if (set.contains(a)) { return null; } set.add(a); return a; } }; } /** * Return a mapper that uses a {@link java.util.Map} instance, and maps keys of that Map to the values. * @param map a {@link java.util.Map} instance * @return a Mapper instance */ public static Mapper mapMapper(final Map map) { return new Mapper() { public Object map(final Object a) { return map.get(a); } }; } /** * Maps an object to the results of the toString() method. */ public final static Mapper toString = new Mapper(){ public Object map(Object a) { return a == null ? null : a.toString(); } }; /** * Maps an object to itself. */ public final static Mapper identity = new Mapper() { public Object map(Object a) { return a; } }; /** * Map one object to another. * * @param a object * @return the new object. */ public abstract Object map(Object a); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy