builder for HashMap

前端 未结 15 2152
迷失自我
迷失自我 2020-11-30 00:17

Guava provides us with great factory methods for Java types, such as Maps.newHashMap().

But are there also builders for java Maps?

HashM         


        
相关标签:
15条回答
  • 2020-11-30 00:37

    Using java 8:

    This is a approach of Java-9 Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)

    public class MapUtil {
        import static java.util.stream.Collectors.toMap;
    
        import java.util.AbstractMap.SimpleEntry;
        import java.util.Map;
        import java.util.Map.Entry;
        import java.util.stream.Stream;
    
        private MapUtil() {}
    
        @SafeVarargs
        public static Map<String, Object> ofEntries(SimpleEntry<String, Object>... values) {
            return Stream.of(values).collect(toMap(Entry::getKey, Entry::getValue));
        }
    
        public static SimpleEntry<String, Object> entry(String key, Object value) {
            return new SimpleEntry<String, Object>(key, value);
        }
    }
    

    How to Use:

    import static your.package.name.MapUtil.*;
    
    import java.util.Map;
    
    Map<String, Object> map = ofEntries(
            entry("id", 1),
            entry("description", "xyz"),
            entry("value", 1.05),
            entry("enable", true)
        );
    
    0 讨论(0)
  • 2020-11-30 00:38

    There is no such thing for HashMaps, but you can create an ImmutableMap with a builder:

    final Map<String, Integer> m = ImmutableMap.<String, Integer>builder().
          put("a", 1).
          put("b", 2).
          build();
    

    And if you need a mutable map, you can just feed that to the HashMap constructor.

    final Map<String, Integer> m = Maps.newHashMap(
        ImmutableMap.<String, Integer>builder().
            put("a", 1).
            put("b", 2).
            build());
    
    0 讨论(0)
  • 2020-11-30 00:40

    I had a similar requirement a while back. Its nothing to do with Guava but you can do something like this to be able to cleanly construct a Map using a fluent builder.

    Create a base class that extends Map.

    public class FluentHashMap<K, V> extends LinkedHashMap<K, V> {
        private static final long serialVersionUID = 4857340227048063855L;
    
        public FluentHashMap() {}
    
        public FluentHashMap<K, V> delete(Object key) {
            this.remove(key);
            return this;
        }
    }
    

    Then create the fluent builder with methods that suit your needs:

    public class ValueMap extends FluentHashMap<String, Object> {
        private static final long serialVersionUID = 1L;
    
        public ValueMap() {}
    
        public ValueMap withValue(String key, String val) {
            super.put(key, val);
            return this;
        }
    
    ... Add withXYZ to suit...
    
    }
    

    You can then implement it like this:

    ValueMap map = new ValueMap()
          .withValue("key 1", "value 1")
          .withValue("key 2", "value 2")
          .withValue("key 3", "value 3")
    
    0 讨论(0)
  • 2020-11-30 00:41

    This is similar to the accepted answer, but a little cleaner, in my view:

    ImmutableMap.of("key1", val1, "key2", val2, "key3", val3);
    

    There are several variations of the above method, and they are great for making static, unchanging, immutable maps.

    0 讨论(0)
  • 2020-11-30 00:43

    You can use:

    HashMap<String,Integer> m = Maps.newHashMap(
        ImmutableMap.of("a",1,"b",2)
    );
    

    It's not as classy and readable, but does the work.

    0 讨论(0)
  • 2020-11-30 00:46

    Here's one I wrote

    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.function.Supplier;
    
    public class MapBuilder<K, V> {
    
        private final Map<K, V> map;
    
        /**
         * Create a HashMap builder
         */
        public MapBuilder() {
            map = new HashMap<>();
        }
    
        /**
         * Create a HashMap builder
         * @param initialCapacity
         */
        public MapBuilder(int initialCapacity) {
            map = new HashMap<>(initialCapacity);
        }
    
        /**
         * Create a Map builder
         * @param mapFactory
         */
        public MapBuilder(Supplier<Map<K, V>> mapFactory) {
            map = mapFactory.get();
        }
    
        public MapBuilder<K, V> put(K key, V value) {
            map.put(key, value);
            return this;
        }
    
        public Map<K, V> build() {
            return map;
        }
    
        /**
         * Returns an unmodifiable Map. Strictly speaking, the Map is not immutable because any code with a reference to
         * the builder could mutate it.
         *
         * @return
         */
        public Map<K, V> buildUnmodifiable() {
            return Collections.unmodifiableMap(map);
        }
    }
    

    You use it like this:

    Map<String, Object> map = new MapBuilder<String, Object>(LinkedHashMap::new)
        .put("event_type", newEvent.getType())
        .put("app_package_name", newEvent.getPackageName())
        .put("activity", newEvent.getActivity())
        .build();
    
    0 讨论(0)
提交回复
热议问题