diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilder.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilder.java new file mode 100644 index 00000000..2647db3d --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilder.java @@ -0,0 +1,203 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.utils.collections; + + +import java.util.HashMap; +import java.util.Map; + + +/******************************************************************************* + ** Map.of is "great", but annoying because it makes unmodifiable maps, and it + ** NPE's on nulls... So, replace it with this, which returns HashMaps, which + ** "don't suck" + *******************************************************************************/ +public class MapBuilder +{ + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + return (rs); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1, + K k2, V v2 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + rs.put(k2, v2); + return (rs); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1, + K k2, V v2, + K k3, V v3 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + rs.put(k2, v2); + rs.put(k3, v3); + return (rs); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1, + K k2, V v2, + K k3, V v3, + K k4, V v4 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + rs.put(k2, v2); + rs.put(k3, v3); + rs.put(k4, v4); + return (rs); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1, + K k2, V v2, + K k3, V v3, + K k4, V v4, + K k5, V v5 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + rs.put(k2, v2); + rs.put(k3, v3); + rs.put(k4, v4); + rs.put(k5, v5); + return (rs); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1, + K k2, V v2, + K k3, V v3, + K k4, V v4, + K k5, V v5, + K k6, V v6 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + rs.put(k2, v2); + rs.put(k3, v3); + rs.put(k4, v4); + rs.put(k5, v5); + rs.put(k6, v6); + return (rs); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1, + K k2, V v2, + K k3, V v3, + K k4, V v4, + K k5, V v5, + K k6, V v6, + K k7, V v7 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + rs.put(k2, v2); + rs.put(k3, v3); + rs.put(k4, v4); + rs.put(k5, v5); + rs.put(k6, v6); + rs.put(k7, v7); + return (rs); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public static Map of( + K k1, V v1, + K k2, V v2, + K k3, V v3, + K k4, V v4, + K k5, V v5, + K k6, V v6, + K k7, V v7, + K k8, V v8 + ) + { + Map rs = new HashMap<>(); + rs.put(k1, v1); + rs.put(k2, v2); + rs.put(k3, v3); + rs.put(k4, v4); + rs.put(k5, v5); + rs.put(k6, v6); + rs.put(k7, v7); + rs.put(k8, v8); + return (rs); + } + +} diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilderTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilderTest.java new file mode 100644 index 00000000..26284df7 --- /dev/null +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/utils/collections/MapBuilderTest.java @@ -0,0 +1,69 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.core.utils.collections; + + +import java.util.Map; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + + +/******************************************************************************* + ** Unit test for MapBuilder + *******************************************************************************/ +class MapBuilderTest +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testSameAsMapOf() + { + assertEquals(Map.of("1", 1), MapBuilder.of("1", 1)); + assertEquals(Map.of("1", 1, "2", 2), MapBuilder.of("1", 1, "2", 2)); + assertEquals(Map.of("1", 1, "2", 2, "3", 3), MapBuilder.of("1", 1, "2", 2, "3", 3)); + assertEquals(Map.of("1", 1, "2", 2, "3", 3, "4", 4), MapBuilder.of("1", 1, "2", 2, "3", 3, "4", 4)); + assertEquals(Map.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5), MapBuilder.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5)); + assertEquals(Map.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5, "6", 6), MapBuilder.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5, "6", 6)); + assertEquals(Map.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5, "6", 6, "7", 7), MapBuilder.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5, "6", 6, "7", 7)); + assertEquals(Map.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5, "6", 6, "7", 7, "8", 8), MapBuilder.of("1", 1, "2", 2, "3", 3, "4", 4, "5", 5, "6", 6, "7", 7, "8", 8)); + } + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testBetterThanMapOf() + { + /////////////////////////////// + // assert this doesn't throw // + /////////////////////////////// + Map map = MapBuilder.of("1", null); + + // this too, doesn't freaking throw. // + /////////////////////////////////////// + map.put("2", null); + } + +} \ No newline at end of file