janput
5/27/2017 - 2:13 AM

[Print maps and collections] with support for lambda instead of toString()

[Print maps and collections] with support for lambda instead of toString()

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.function.Function;

public class CollectionUtils {

    private final static Logger LOGGER = LoggerFactory.getLogger(CollectionUtils.class);

    private CollectionUtils() {
    }

    public static void printMap(Map<? extends Object, ? extends Object> input) {
        LOGGER.info(printMapInternal(input, "\t"));
    }

    public static <T extends Object> void printList(Collection<T> c) {
        LOGGER.info(printListInternal(c, "\t", Object::toString));
    }

    public static <T extends Object> void printList(Collection<T> c, Function<T, String> function) {
        LOGGER.info(printListInternal(c, "\t", function));
    }

    private static <T extends Object> String printListInternal(Collection<T> c, String prefix, Function<T, String> function) {
        StringBuilder sb = new StringBuilder();

        if (c == null) {
            sb.append("\n").append(prefix).append("List is null\n");
            return sb.toString();
        }
        sb.append(c.getClass().getSimpleName()).append("@").append(System.identityHashCode(c));
        if (c.isEmpty()) {
            sb.append(" List is empty\n");
            return sb.toString();
        }

        sb.append(" containing ").append(c.size()).append(" elements:\n");
        int i = 0;
        for (T o : c) {
            sb.append(prefix).append("[").append(i).append("] = ");
            if (o == null) {
                sb.append("null");
            } else if (o.getClass().isArray()) {
                sb.append(printListInternal(Arrays.asList((T[]) o), prefix + "\t", function));
            } else if (o instanceof Collection) {
                sb.append(printListInternal((Collection) o, prefix + "\t", function));
            } else {
                sb.append(function.apply(o));
            }
            sb.append("\n");
            i++;
        }
        return sb.toString();
    }

    private static String printMapInternal(Map<? extends Object, ? extends Object> input, String prefix) {
        StringBuilder sb = new StringBuilder();

        if (input == null) {
            sb.append("\n").append(prefix).append("Map is null\n");
            return sb.toString();
        }

        sb.append(input.getClass().getSimpleName()).append("@").append(System.identityHashCode(input));
        if (input.isEmpty()) {
            sb.append(" Map is empty\n");
            return sb.toString();
        }

        sb.append(" containing ").append(input.size()).append(" elements:\n");
        for (Map.Entry<?, ?> entry : input.entrySet()) {
            Object key = entry.getKey();
            Object value = entry.getValue();
            sb.append(prefix).append("[").append(key).append("] = ");

            if (value instanceof Map) {
                sb.append(printMapInternal((Map) value, prefix + "\t"));
            } else if (value instanceof Collection) {
                Collection<? extends Object> collection = (Collection<? extends Object>) value;
                sb.append(printListInternal(collection, prefix + "\t", Object::toString));
            } else {
                sb.append(value).append("\n");
            }
        }
        return sb.toString();
    }
}