Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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

loading...
Předmět Autor Datum
Nijak zvlášť složitá mi teda nepřipadá. A je úmysl, že to jako celé číslo bude brát i string obsahuj…
Wikan 01.06.2019 06:16
Wikan
Ano, tuhle metodu volám pouze za účelem to vypsat, proto to metoda vrací jako pole String. A není s…
MichalDM 01.06.2019 15:56
MichalDM
A co konkrétně ti na tom nepřijde vhodné?
Wikan 01.06.2019 21:38
Wikan
Jak jsem řekl, vracím tam na dvou místech prázdný řetězec. A hlavně, složená podmínka je seřazena se…
MichalDM 01.06.2019 23:15
MichalDM
Podle mě je blbost dělat to co děláš přes reflexi. Čeho se snažíš dosáhnout? Jalý je usecase?
vlada01 01.06.2019 23:42
vlada01
To uz jsme mu tady psali, neda si rict a neda...
MaSo 02.06.2019 07:07
MaSo
Nedá si říct? Jen jsem to chtěl vyzkoušet. A když jsem s tím začal, tak bych to dokončil.
MichalDM 02.06.2019 12:47
MichalDM
Vrátit požadované fieldy a vypsat je. Včetně názvu fieldu u všech čísel.
MichalDM 02.06.2019 12:48
MichalDM
Konečný kód je public ArrayList<Text> getAllFields() { return Arrays.stream(getClass().getDeclared… poslední
MichalDM 12.06.2019 23:12
MichalDM

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ě:

private String getFieldValue(final Field field) {
    try {
        String value = field.get(this).toString();
        if (value.matches("-?\\d+")) {
            return field.getName() + " " + value;
        } else if (isName(value)) {
            return value;
        }
    } catch (final IllegalAccessException e) {
        throw new RuntimeException(e);
    }
    return "";
}

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

Konečný kód je

    public ArrayList<Text> getAllFields() {
        return Arrays.stream(getClass().getDeclaredFields())
                .filter(field -> !Modifier.isStatic(field.getModifiers()))
                .map(this::getFieldValue)
                .filter(field -> !field.isEmpty())
                .map(field -> new Text(field))
                .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 (value.equals(NAME)) {
                return value;
            } else {
                return "";
            }
        } catch (final IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

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.

Zpět do poradny Odpovědět na původní otázku Nahoru

loading...