Ich habe separate Verzeichnisse mit Dateien mit Eigenschaften für Klassen und Verzeichnisse mit Eigenschaften für ihre eingebetteten Objekttypen. Erste Eigenschaften für die Klasse werden geladen, dann loadEmbeddedTypeProps()
Methode durchläuft Felder einer Klasse und wenn ein Feld eines bestimmten Typs (Ich habe im Beispiel unten Aufgezählt) gefunden wird, dann werden Eigenschaften für den Typ auch aus einem anderen Verzeichnis geladen. Und schließlich werden Eigenschaften für die Klasse und für ihre eingebetteten Typen zusammengeführt mergeProperties()
Methode heißt.Wie verwende ich computeIfAbsent() zum Cachen von Daten in einer HashMap?
Ich entschied mich, Eigenschaften für eingebettete Typen in einer statischen Hash-Map cachedProperties
zwischenzuspeichern. Wenn es bereits Eigenschaften für einen bestimmten Schlüssel enthält, dann erhalten wir sie von cachedProperties
und verschmelzen mit einer HashMap locaProperties
. Wenn nicht, laden wir die Eigenschaften aus einer Datei (loadPropsForType()
heißt).
Die Logik funktioniert wie erwartet aber es sieht aus wie der Code in den loadEmbeddedTypeProps()
Verfahren kann durch die Verwendung computeIfAbsent
Verfahren verbessert werden. Ich habe vor kurzem begonnen, mit Lambda zu experimentieren und bin mir nicht sicher, wie dies hier implementiert werden könnte. Ist es auch ein geeigneter Ort, um computeIfAbsent
zu verwenden?
private static Map<String, Map<String, Properties>> cachedProperties = new HashMap<>();
private Map<String, Properties> loadEmbeddedTypeProps(Class myClass) {
Map<String, Properties> localProperties = new HashMap<>();
Arrays.stream(myClass.getFields())
.filter(field -> field.getType().isAssignableFrom(Enumerated.class))
.forEach(field -> {
String fieldName = field.getType().getSimpleName();
String enumTypeName = StringUtils.uncapitalize(fieldName);
try {
if (cachedProperties.containsKey(enumTypeName)) {
// properties for enumerated type are already in cache
Map<String, Properties> propertiesFromCache = cachedProperties.get(enumTypeName);
mergeProperties(propertiesFromCache, localProperties);
} else {
// properties for enumerated type are not cached yet
Map<String, Properties> loadEnumProperties = loadPropsForType(enumTypeName);
cachedProperties.put(enumTypeName, loadEnumProperties);
mergeProperties(loadEnumProperties, localProperties);
}
} catch (IOException e) {
e.printStackTrace();
}
});
return localProperties;
}
Gibt 'loadPropsForType' die' IOException'? –
@JornVernee Ja, die Methode löst "IOException" aus – samba