Occhio solo ad alcuni piccoli aspetti da tenere presente:

Quote Originariamente inviata da fermat Visualizza il messaggio
codice:
images = lid.getImages(dc.showDialog(getStage().getOwner(), "Choose directory").get());
Il get() non va usato così in modo indiscriminato. Perché se il Optional è "vuoto", il get() lancia NoSuchElementException.
Il Optional, detto in generale, andrebbe gestito o usando es. isPresent() (cioè testando prima di fare il get() ), oppure usandolo in maniera più "funzionale" con i map/filter/ecc...


Quote Originariamente inviata da fermat Visualizza il messaggio
codice:
    public ArrayList<String> getFilesExts(File dir, String... extensions) {
        ArrayList<String> listfiles = new ArrayList<>();
        if (dir != null) {
            File[] files = dir.listFiles(new ExtensionFilenameFilter(extensions));
            for (File f : files) {
                listfiles.add(f.getAbsolutePath());
            }
        }
        return listfiles;
    }

Attenzione ad un piccolo cavillo. Il listFiles può restituire null in due casi: il File usato non è una directory o c'è stato un errore di I/O durante la scansione. Questo andrebbe considerato. Nel tuo caso sbucherebbe fuori un NullPointerException all'inizio del for-each.


P.S.
Riguardo il ExtensionFilenameFilter c'è una cosa che non mi è venuta in mente prima. Sono partito in quarta per farti vedere come implementavo FilenameFilter. Ma visto che si tratta di filtrare solo file, sarebbe stato più utile implementare FileFilter per poter testare facilmente se è un file con isFile().
E' una finezza nel senso che difficilmente qualcuno si fa una directory chiamata qualcosa.jpg ... ma sai, non si sa mai ....