

Java - ArrayList - Stream - Vypsání názvu a hodnoty fieldu - problém s null
Dobrý den,
Jedná se o poslední úpravu kódu, chtěl jsem to dodělat do konce.
public ArrayList<String> getAllFields() {
return Arrays.stream(getClass().getDeclaredFields())
.filter(field -> !Modifier.isStatic(field.getModifiers()))
.map(this::getFieldValue)
.filter(field -> !field.isEmpty())
.collect(Collectors.toCollection(ArrayList::new));
}
private String getFieldValue(final Field field) {
try {
if (field.get(this) == null) {
return "";
}
String value = field.get(this).toString();
if (value.matches("-?\\d+")) {
return field.getName() + " " + value;
} else if (isName(value)) {
return value;
} else {
return "";
}
} catch (final IllegalAccessException e) {
throw new RuntimeException(e);
}
}
private boolean isName(String field) {
return field.equals(name);
}
Tenhle kód sice dělá přesně, co chci - vypíše jeden String bez názvu fieldu a celá čísla s názvem fieldu, ale metoda getFieldValue je zbytečně složitá.
Na začátku musím vždy zkontrolovat, jestli je field null, jinak to zhavaruje.
Nejde to, prosím Vás, nějak zjednodušit?
Děkuji
Nijak zvlášť složitá mi teda nepřipadá. A je úmysl, že to jako celé číslo bude brát i string obsahující celé číslo?
Ano, tuhle metodu volám pouze za účelem to vypsat, proto to metoda vrací jako pole String.
A není složitá? Asi ne, ale ve dvou samostatných případech vracím prázdný řetězec, což mi nepřijde vhodné.
A co konkrétně ti na tom nepřijde vhodné?
Jak jsem řekl, vracím tam na dvou místech prázdný řetězec. A hlavně, složená podmínka je seřazena sestupně podle pravděpodobnosti. Tak to má být vždycky.
Jenže tou podmínku na začátku se to "zničilo". Navíc, nastane to pouze, pokud neinicializuji objekt field respektive je to pouze prevence.
Bylo by to dobré nějak v podobě:
To zhavaruje s java.lang.reflect.InvocationTargetException. Jenže, po přidání této chyby do catch, NetBeans zahlásí, že k chybě nikdy nedojde a stejně to po spuštění zhavaruje, což nechápu.
Jak by jste to, prosím Vás, upravil?
Děkuji
Podle mě je blbost dělat to co děláš přes reflexi. Čeho se snažíš dosáhnout? Jalý je usecase?
To uz jsme mu tady psali, neda si rict a neda...
Nedá si říct? Jen jsem to chtěl vyzkoušet. A když jsem s tím začal, tak bych to dokončil.
Vrátit požadované fieldy a vypsat je. Včetně názvu fieldu u všech čísel.
Konečný kód je
S null to nijak nepůjde, NAME je field objektu a pro vypsání pod sebou, je nejlepší použít javafx.scene.layout.VBox. Ten však String nevezme. Proto je nutné to přetypovat na javafx.scene.text.Text.