@Override protected <K2, V2> HashMultimap<K2, V2> createFromMap(Map<K2, Traversable<V2>> back) { return new HashMultimap<>(back, getContainerType(), emptyContainer); }
/** * Creates a HashMultimap of the given key-value pair. * Returns a singleton {@code HashMultimap}, i.e. a {@code HashMultimap} of one entry. * * @param <K> The key type * @param <V2> The value type * @param entry A tuple containing the key-value pair. * @return A new HashMultimap containing the given entry. */ public <K, V2 extends V> HashMultimap<K, V2> of(Tuple2<? extends K, ? extends V2> entry) { final HashMultimap<K, V2> e = empty(); return e.put(entry._1, entry._2); }
@Override <K, V> Multimap<K, V> emptyMap() { return HashMultimap.withSeq().empty(); }
@Test public void testHashMultimap() throws Exception { HashMultimap<String, A> src = HashMultimap.withSeq().of("a", new B("a", "b")); String json = MAPPER.writeValueAsString(new HashMultimapPojo().setValue(src)); Assert.assertEquals(json, "{\"value\":{\"a\":[{\"ExtFieldsPojoTest$B\":{\"a\":\"a\",\"b\":\"b\"}}]}}"); HashMultimapPojo pojo = MAPPER.readValue(json, HashMultimapPojo.class); HashMultimap<String, A> restored = pojo.getValue(); Assert.assertTrue(restored.get("a").get().head() instanceof B); Assert.assertEquals(restored.get("a").get().head().a, "a"); Assert.assertEquals(((B) restored.get("a").get().head()).b, "b"); }
@Test public void testHashMultimapClass() throws Exception { HashMultimapClass src = new HashMultimapClass(HashMultimap.withSeq().of(42, new ImplementedClass())); String json = MAPPER.writeValueAsString(src); HashMultimapClass restored = MAPPER.readValue(json, HashMultimapClass.class); Assert.assertEquals(restored.value.head()._2.getClass(), ImplementedClass.class); }
/** * Returns the empty {@code HashMultimap}. * * @param <K> The key type * @param <V2> The value type * @return A new empty HashMultimap. */ public <K, V2 extends V> HashMultimap<K, V2> empty() { return new HashMultimap<>(HashMap.empty(), containerType, emptyContainer); }
if (complexInnerClassTreeMap != null ? !complexInnerClassTreeMap.equals(that.complexInnerClassTreeMap) : that.complexInnerClassTreeMap != null) return false; if (complexInnerClassHashMultimap != null ? !complexInnerClassHashMultimap.equals(that.complexInnerClassHashMultimap) : that.complexInnerClassHashMultimap != null) return false; if (complexInnerClassTreeMultimap != null ? !complexInnerClassTreeMultimap.equals(that.complexInnerClassTreeMultimap) : that.complexInnerClassTreeMultimap != null)
@Override public int hashCode() { int result = complexInnerClassHashMap != null ? complexInnerClassHashMap.hashCode() : 0; result = 31 * result + (complexInnerClassTreeMap != null ? complexInnerClassTreeMap.hashCode() : 0); result = 31 * result + (complexInnerClassHashMultimap != null ? complexInnerClassHashMultimap.hashCode() : 0); result = 31 * result + (complexInnerClassTreeMultimap != null ? complexInnerClassTreeMultimap.hashCode() : 0); result = 31 * result + (complexInnerClasses != null ? complexInnerClasses.hashCode() : 0); result = 31 * result + (complexInnerClassList != null ? complexInnerClassList.hashCode() : 0); result = 31 * result + (complexInnerClassQueue != null ? complexInnerClassQueue.hashCode() : 0); result = 31 * result + (complexInnerClassStream != null ? complexInnerClassStream.hashCode() : 0); result = 31 * result + (complexInnerClassVector != null ? complexInnerClassVector.hashCode() : 0); result = 31 * result + (complexInnerClassHashSet != null ? complexInnerClassHashSet.hashCode() : 0); result = 31 * result + (complexInnerClassTreeSet != null ? complexInnerClassTreeSet.hashCode() : 0); result = 31 * result + (complexInnerClassTuple2 != null ? complexInnerClassTuple2.hashCode() : 0); result = 31 * result + (opt1 != null ? opt1.hashCode() : 0); result = 31 * result + (opt2 != null ? opt2.hashCode() : 0); return result; }
@Override public Multimap<?, ?> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { final java.util.List<Tuple2<Object, Object>> result = new java.util.ArrayList<>(); while (p.nextToken() != JsonToken.END_OBJECT) { String name = p.getCurrentName(); Object key = keyDeserializer.deserializeKey(name, ctxt); p.nextToken(); ArrayList<?> list = (ArrayList<?>) containerDeserializer.deserialize(p, ctxt); for (Object elem : list) { result.add(Tuple.of(key, elem)); } } if (TreeMultimap.class.isAssignableFrom(handledType())) { return TreeMultimap.withSeq().ofEntries(keyComparator, result); } if (LinkedHashMultimap.class.isAssignableFrom(handledType())) { return LinkedHashMultimap.withSeq().ofEntries(result); } // default deserialization [...] -> Map return HashMultimap.withSeq().ofEntries(result); } }
@Test public void testHashMultimap() throws Exception { HashMultimap<String, I> src = HashMultimap.withSeq().of("a", new A(), "b", new B()); String json = MAPPER.writeValueAsString(new HashMultimapPojo().setValue(src)); Assert.assertEquals(json, "{\"value\":{\"a\":[{\"type\":\"a\"}],\"b\":[{\"type\":\"b\"}]}}"); HashMultimapPojo pojo = MAPPER.readValue(json, HashMultimapPojo.class); HashMultimap<String, I> restored = pojo.getValue(); Assert.assertTrue(restored.get("a").get().head() instanceof A); Assert.assertTrue(restored.get("b").get().head() instanceof B); }
/** * Returns the empty {@code HashMultimap}. * * @param <K> The key type * @param <V2> The value type * @return A new empty HashMultimap. */ public <K, V2 extends V> HashMultimap<K, V2> empty() { return new HashMultimap<>(HashMap.empty(), containerType, emptyContainer); }
@Test public void testHashMultimapOfSeqString() throws Exception { String src00 = "A"; String src01 = "B"; Tuple2<String, String> src0 = Tuple.of(src00, src01); String src10 = "A"; String src11 = "C"; Tuple2<String, String> src1 = Tuple.of(src10, src11); HashMultimap<String, String> src = HashMultimap.withSeq().ofEntries(src0, src1); String json = MAPPER.writeValueAsString(new ParameterizedHashMultimapPojo<>(src)); Assert.assertEquals(json, "{\"value\":{\"A\":[\"B\",\"C\"]}}"); ParameterizedHashMultimapPojo<java.lang.String, java.lang.String> restored = MAPPER.readValue(json, new TypeReference<ParameterizedHashMultimapPojo<java.lang.String, java.lang.String>>(){}); Assert.assertEquals(src, restored.getValue()); }
/** * Creates a HashMultimap of the given list of key-value pairs. * * @param k1 a key for the map * @param v1 the value for k1 * @param k2 a key for the map * @param v2 the value for k2 * @param <K> The key type * @param <V2> The value type * @return A new Multimap containing the given entries */ public <K, V2 extends V> HashMultimap<K, V2> of(K k1, V2 v1, K k2, V2 v2) { return of(k1, v1).put(k2, v2); }
@SuppressWarnings("unchecked") @Override protected <K2, V2> HashMultimap<K2, V2> emptyInstance() { return new HashMultimap<>(HashMap.empty(), getContainerType(), emptyContainer); }
@Test public void testHashMultimapOfSeqString() throws Exception { String src00 = "A"; String src01 = "B"; Tuple2<String, String> src0 = Tuple.of(src00, src01); String src10 = "A"; String src11 = "C"; Tuple2<String, String> src1 = Tuple.of(src10, src11); HashMultimap<String, String> src = HashMultimap.withSeq().ofEntries(src0, src1); String json = MAPPER.writeValueAsString(new HashMultimapOfSeqString().setValue(src)); Assert.assertEquals(json, "{\"value\":{\"A\":[\"B\",\"C\"]}}"); HashMultimapOfSeqString restored = MAPPER.readValue(json, HashMultimapOfSeqString.class); Assert.assertEquals(src, restored.getValue()); }
/** * Creates a HashMultimap of the given key-value pair. * * @param key a key for the map * @param value the value for key * @param <K> The key type * @param <V2> The value type * @return A new Multimap containing the given entries */ public <K, V2 extends V> HashMultimap<K, V2> of(K key, V2 value) { final HashMultimap<K, V2> e = empty(); return e.put(key, value); }
@Override protected <K2, V2> HashMultimap<K2, V2> createFromMap(Map<K2, Traversable<V2>> back) { return new HashMultimap<>(back, getContainerType(), emptyContainer); }
@Test public void testHashMultimapOfSeqTuple() throws Exception { String src00 = "A"; String src010 = "A"; String src011 = "B"; Tuple2<String, String> src01 = Tuple.of(src010, src011); Tuple2<String, Tuple2<String, String>> src0 = Tuple.of(src00, src01); String src10 = "A"; String src110 = "C"; String src111 = "D"; Tuple2<String, String> src11 = Tuple.of(src110, src111); Tuple2<String, Tuple2<String, String>> src1 = Tuple.of(src10, src11); HashMultimap<String, Tuple2<String, String>> src = HashMultimap.withSeq().ofEntries(src0, src1); String json = MAPPER.writeValueAsString(new ParameterizedHashMultimapPojo<>(src)); Assert.assertEquals(json, "{\"value\":{\"A\":[[\"A\",\"B\"],[\"C\",\"D\"]]}}"); ParameterizedHashMultimapPojo<java.lang.String, io.vavr.Tuple2<java.lang.String, java.lang.String>> restored = MAPPER.readValue(json, new TypeReference<ParameterizedHashMultimapPojo<java.lang.String, io.vavr.Tuple2<java.lang.String, java.lang.String>>>(){}); Assert.assertEquals(src, restored.getValue()); }
/** * Creates a HashMultimap of the given list of key-value pairs. * * @param k1 a key for the map * @param v1 the value for k1 * @param k2 a key for the map * @param v2 the value for k2 * @param k3 a key for the map * @param v3 the value for k3 * @param <K> The key type * @param <V2> The value type * @return A new Multimap containing the given entries */ public <K, V2 extends V> HashMultimap<K, V2> of(K k1, V2 v1, K k2, V2 v2, K k3, V2 v3) { return of(k1, v1, k2, v2).put(k3, v3); }
@SuppressWarnings("unchecked") @Override protected <K2, V2> HashMultimap<K2, V2> emptyInstance() { return new HashMultimap<>(HashMap.empty(), getContainerType(), emptyContainer); }