/** * Returns a LinkedHashMultimap containing {@code n} values supplied by a given Supplier {@code s}. * * @param <K> The key type * @param <V2> The value type * @param n The number of elements in the LinkedHashMultimap * @param s The Supplier computing element values * @return A LinkedHashMultimap of size {@code n}, where each element contains the result supplied by {@code s}. * @throws NullPointerException if {@code s} is null */ @SuppressWarnings("unchecked") public <K, V2 extends V> LinkedHashMultimap<K, V2> fill(int n, Supplier<? extends Tuple2<? extends K, ? extends V2>> s) { Objects.requireNonNull(s, "s is null"); return ofEntries(Collections.fill(n, (Supplier<? extends Tuple2<K, V2>>) s)); }
/** * Returns a LinkedHashMultimap containing {@code n} values of a given Function {@code f} * over a range of integer values from 0 to {@code n - 1}. * * @param <K> The key type * @param <V2> The value type * @param n The number of elements in the LinkedHashMultimap * @param f The Function computing element values * @return A LinkedHashMultimap consisting of elements {@code f(0),f(1), ..., f(n - 1)} * @throws NullPointerException if {@code f} is null */ @SuppressWarnings("unchecked") public <K, V2 extends V> LinkedHashMultimap<K, V2> tabulate(int n, Function<? super Integer, ? extends Tuple2<? extends K, ? extends V2>> f) { Objects.requireNonNull(f, "f is null"); return ofEntries(Collections.tabulate(n, (Function<? super Integer, ? extends Tuple2<K, V2>>) f)); }
/** * Returns a LinkedHashMultimap containing {@code n} values supplied by a given Supplier {@code s}. * * @param <K> The key type * @param <V2> The value type * @param n The number of elements in the LinkedHashMultimap * @param s The Supplier computing element values * @return A LinkedHashMultimap of size {@code n}, where each element contains the result supplied by {@code s}. * @throws NullPointerException if {@code s} is null */ @SuppressWarnings("unchecked") public <K, V2 extends V> LinkedHashMultimap<K, V2> fill(int n, Supplier<? extends Tuple2<? extends K, ? extends V2>> s) { Objects.requireNonNull(s, "s is null"); return ofEntries(Collections.fill(n, (Supplier<? extends Tuple2<K, V2>>) s)); }
@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 testLinkedHashMultimapOfSeqTuple() 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); LinkedHashMultimap<String, Tuple2<String, String>> src = LinkedHashMultimap.withSeq().ofEntries(src0, src1); String json = MAPPER.writeValueAsString(new ParameterizedLinkedHashMultimapPojo<>(src)); Assert.assertEquals(json, "{\"value\":{\"A\":[[\"A\",\"B\"],[\"C\",\"D\"]]}}"); ParameterizedLinkedHashMultimapPojo<java.lang.String, io.vavr.Tuple2<java.lang.String, java.lang.String>> restored = MAPPER.readValue(json, new TypeReference<ParameterizedLinkedHashMultimapPojo<java.lang.String, io.vavr.Tuple2<java.lang.String, java.lang.String>>>(){}); Assert.assertEquals(src, restored.getValue()); }
@Test public void testLinkedHashMultimapOfSeqTuple() 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); LinkedHashMultimap<String, Tuple2<String, String>> src = LinkedHashMultimap.withSeq().ofEntries(src0, src1); String json = MAPPER.writeValueAsString(new LinkedHashMultimapOfSeqTuple().setValue(src)); Assert.assertEquals(json, "{\"value\":{\"A\":[[\"A\",\"B\"],[\"C\",\"D\"]]}}"); LinkedHashMultimapOfSeqTuple restored = MAPPER.readValue(json, LinkedHashMultimapOfSeqTuple.class); Assert.assertEquals(src, restored.getValue()); }
/** * Returns a LinkedHashMultimap containing {@code n} values of a given Function {@code f} * over a range of integer values from 0 to {@code n - 1}. * * @param <K> The key type * @param <V2> The value type * @param n The number of elements in the LinkedHashMultimap * @param f The Function computing element values * @return A LinkedHashMultimap consisting of elements {@code f(0),f(1), ..., f(n - 1)} * @throws NullPointerException if {@code f} is null */ @SuppressWarnings("unchecked") public <K, V2 extends V> LinkedHashMultimap<K, V2> tabulate(int n, Function<? super Integer, ? extends Tuple2<? extends K, ? extends V2>> f) { Objects.requireNonNull(f, "f is null"); return ofEntries(Collections.tabulate(n, (Function<? super Integer, ? extends Tuple2<K, V2>>) f)); }
@Test public void testLinkedHashMultimapOfSeqString() 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); LinkedHashMultimap<String, String> src = LinkedHashMultimap.withSeq().ofEntries(src0, src1); String json = MAPPER.writeValueAsString(new ParameterizedLinkedHashMultimapPojo<>(src)); Assert.assertEquals(json, "{\"value\":{\"A\":[\"B\",\"C\"]}}"); ParameterizedLinkedHashMultimapPojo<java.lang.String, java.lang.String> restored = MAPPER.readValue(json, new TypeReference<ParameterizedLinkedHashMultimapPojo<java.lang.String, java.lang.String>>(){}); Assert.assertEquals(src, restored.getValue()); }
@Test public void testLinkedHashMultimapOfSeqString() 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); LinkedHashMultimap<String, String> src = LinkedHashMultimap.withSeq().ofEntries(src0, src1); String json = MAPPER.writeValueAsString(new LinkedHashMultimapOfSeqString().setValue(src)); Assert.assertEquals(json, "{\"value\":{\"A\":[\"B\",\"C\"]}}"); LinkedHashMultimapOfSeqString restored = MAPPER.readValue(json, LinkedHashMultimapOfSeqString.class); Assert.assertEquals(src, restored.getValue()); }
/** * Returns a LinkedHashMultimap containing {@code n} times the given {@code element} * * @param <K> The key type * @param <V2> The value type * @param n The number of elements in the LinkedHashMultimap * @param element The element * @return A LinkedHashMultimap of size {@code 1}, where each element contains {@code n} values of {@code element._2}. */ @SuppressWarnings("unchecked") public <K, V2 extends V> LinkedHashMultimap<K, V2> fill(int n, Tuple2<? extends K, ? extends V2> element) { return ofEntries(Collections.fillObject(n, element)); }
/** * Returns a LinkedHashMultimap containing {@code n} times the given {@code element} * * @param <K> The key type * @param <V2> The value type * @param n The number of elements in the LinkedHashMultimap * @param element The element * @return A LinkedHashMultimap of size {@code 1}, where each element contains {@code n} values of {@code element._2}. */ @SuppressWarnings("unchecked") public <K, V2 extends V> LinkedHashMultimap<K, V2> fill(int n, Tuple2<? extends K, ? extends V2> element) { return ofEntries(Collections.fillObject(n, element)); }