diff --git a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureDefinition.java b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureDefinition.java index 81b33e14..0a917149 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/structure/StructureDefinition.java +++ b/src/main/java/com/gtnewhorizon/structurelib/structure/StructureDefinition.java @@ -3,6 +3,7 @@ package com.gtnewhorizon.structurelib.structure; import com.gtnewhorizon.structurelib.util.Vec3Impl; import java.util.*; +import java.util.stream.Collectors; import static com.gtnewhorizon.structurelib.StructureLib.DEBUG_MODE; import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; @@ -138,28 +139,16 @@ public class StructureDefinition implements IStructureDefinition { @SuppressWarnings("unchecked") private Map[]> compileElementSetMap() { - Set missing = new HashSet<>(); - shapes.values().stream().map(CharSequence::chars).forEach(intStream -> intStream.forEach(c -> { - IStructureElement iStructureElement = elements.get((char) c); - if (iStructureElement == null) { - missing.add(c); - } - })); + Set missing = findMissing(); if (missing.isEmpty()) { - Map[]> map = new HashMap<>(); - shapes.forEach((key, value) -> { - Set chars = new HashSet<>(); - for (char c : value.toCharArray()) { - chars.add(c); - } - IStructureElement[] compiled = new IStructureElement[chars.size()]; - int i = 0; - for (Character aChar : chars) { - compiled[i++] = elements.get(aChar); - } - map.put(key, compiled); - }); - return map; + return shapes.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, + e -> e.getValue().chars() + .mapToObj(c -> (char) c) + .distinct() + .map(elements::get) + .toArray(IStructureElement[]::new) + )); } else { throw new RuntimeException("Missing Structure Element bindings for (chars as integers): " + Arrays.toString(missing.toArray())); @@ -168,28 +157,25 @@ public class StructureDefinition implements IStructureDefinition { @SuppressWarnings("unchecked") private Map[]> compileStructureMap() { - Set mising = new HashSet<>(); - shapes.values().stream().map(CharSequence::chars).forEach(intStream -> intStream.forEach(c -> { - IStructureElement iStructureElement = elements.get((char) c); - if (iStructureElement == null) { - mising.add(c); - } - })); - if (mising.isEmpty()) { - Map[]> map = new HashMap<>(); - shapes.forEach((key, value) -> { - IStructureElement[] compiled = new IStructureElement[value.length()]; - for (int i = 0; i < value.length(); i++) { - compiled[i] = elements.get(value.charAt(i)); - } - map.put(key, compiled); - }); - return map; + Set missing = findMissing(); + if (missing.isEmpty()) { + return shapes.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, + e -> e.getValue().chars().mapToObj(c -> elements.get((char) c)).toArray(IStructureElement[]::new) + )); } else { throw new RuntimeException("Missing Structure Element bindings for (chars as integers): " + - Arrays.toString(mising.toArray())); + Arrays.toString(missing.toArray())); } } + + private Set findMissing() { + return shapes.values().stream() + .flatMapToInt(CharSequence::chars) + .filter(i -> !elements.containsKey((char) i)) + .boxed() + .collect(Collectors.toSet()); + } } public Map> getElements() {