@Beta
    public <R, E extends Exception, E2 extends Exception> List<R> filterThenFlatMap(final Try.Predicate<? super T, E> filter,
            final Try.Function<? super T, ? extends Collection<? extends R>, E2> mapper) throws E, E2 {
        N.checkArgNotNull(filter);
        N.checkArgNotNull(mapper);

        final List<R> result = new ArrayList<>();

        Collection<? extends R> c = null;

        for (T e : coll) {
            if (filter.test(e)) {
                c = mapper.apply(e);

                if (N.notNullOrEmpty(c)) {
                    result.addAll(c);
                }
            }
        }

        return result;
    }
@ Beta public < R , E extends Exception , E2 extends Exception > List < R > filterThenFlatMap ( final Try . Predicate < ? super T , E > filter , final Try . Function < ? super T , ? extends Collection < ? extends R > , E2 > mapper ) throws E , E2 { N . checkArgNotNull ( filter ) ; N . checkArgNotNull ( mapper ) ; final List < R > result = new ArrayList < > ( ) ; Collection < ? extends R > c = null ; for ( T e : coll ) { if ( filter . test ( e ) ) { c = mapper . apply ( e ) ; if ( N . notNullOrEmpty ( c ) ) { result . addAll ( c ) ; } } } return result ; }
For better performance, comparing to {@code Stream}.

@param filter
@param mapper
@return
@throws E
@throws E2