package main.java; import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.StreamSupport; public class ObjectColumnSelectorBuilder { private final Class _canon; private final List>> _items = new ArrayList<>(); private final List> _anonymous = new ArrayList<>(); public ObjectColumnSelectorBuilder(Class canon) { this._canon = canon; } public ObjectColumnSelectorBuilder bind(String displayName, Function getter) { _items.add(new AbstractMap.SimpleEntry<>(displayName, getter::apply)); return this; } public ObjectColumnSelectorBuilder bindAnonymous(Function getter) { _anonymous.add(getter::apply); return this; } public Function build() { return items -> { if (items instanceof Object[] && _canon.isAssignableFrom(((Object[]) items).getClass().getComponentType()) || items instanceof Iterable && StreamSupport.stream(((Iterable) items).spliterator(), false). allMatch(it->it==null||_canon.isInstance(it))) { if (!_items.isEmpty()) { return _items.toArray(new AbstractMap.SimpleEntry[0]); } else { return _anonymous.toArray(new Function[0]); } } else { return null; } }; } }