Kontinent ist ein zusammengesetztes Objekt. Die Struktur ist:Java Optionale Verwendung für Multi-Map
Continent
--Country
----State
------Town
so in dieser Notation:
town= Optional.of(continent)
.map(Continent::getCountry)
.map(Country::getState)
.map(State::getTown)
.orElse(null);
dies funktioniert gut, aber wenn ich versuche, eine allgemeine Mapper zu schreiben,
public static <T, R> T getFromMapping(R source,
T defaultValue,
Function<?,?>... functions) {
Optional sourceWrapper = Optional.ofNullable(source);
for (Function function : functions) {
sourceWrapper.map(function);
}
return (T) sourceWrapper.orElse(defaultValue);
}
und rufen Sie es von
portfolio = getFromMapping(continent, null,
((Function<Continent, Country>) Continent::getCountry)
((Function<Country, State>) Country::getState),
((Function<State, Town>) State::getTown));
es kompilieren einfach gut aber arbeite nicht. Der Mapper springt zum zweiten Schritt nach und sagt, Kontinent könne nicht ins Land werfen, warum? sollte es beim Mapping keine Besetzung geben, wie kann man es reparieren?
Sie können Ihre "T" und "R" tauschen, um Verwechslungen zu vermeiden. 'java.util.function' hat die lockere Namenskonvention, dass' T' und 'U' Eingaben sind und' R' ein Rückgabewert ist. Sie bauen im Wesentlichen eine 'Funktion' –
Vorschlag: Wenn Sie Varianten von 'getFromMapping' mit festen Nummern von Funktionen erstellen, haben Sie eine typsichere Lösung und brauchen die Argumente nicht mehr zu werfen. – stholzm
@HankD Danke Hank, ich habe die Schnittstelle ~ –