Chceš v prípade exception vrátiť prázdny reťazec? Tak potom áno, ale normálnejšie je zabaliť to do RuntimeException, t.j. v catch bude throw new RuntimeException(e). V takom prípade ti stačí chytať IllegalAccessException, keďže IllegalArgumentException už je zdedená z RuntimeException.
Mimochodom, ak lambda funkcia iba volá nejakú metódu s pôvodným parametrom, tak môžeš použiť rovno referenciu na metódu. V tomto prípade "f -> list.add(f)" môžeš zapísať ako "list::add" a rovnako "f -> mapping(f)" môžeš zapísať ako "this::mapping". Tá metóda mapping by mala byť statická, takže potom by to mohlo vyzerať ako "MojaTrieda::mapping". Inak, to čo je za názov metódy, že "mapping"? Tam by sa skôr hodilo niečo ako "getFieldValue" alebo niečo podobné.
Inak namiesto ".forEach(f -> list.add(f))" môžeš rovno zozbierať namapované hodnoty do listu, t.j. niečo typu list = fields.stream().filter(...).map(...).collect(Collectors.toList()). (+ definovať niekde typ)
Ďalej namiesto robenia listu z poľa a následne arraylistu z listu, z ktorého aj tak nakoniec spravíš stream môžeš rovno spraviť z poľa stream pomocou metódy "Arrays.stream".
Keď každé zreťazené volanie dáš na nový riadok, tak to bude aj čitateľné.