code: protected static UDFFinder loadPoiCustomFunctions(Map<String, Class<? extends ICustomFunction>> fs) {
          List<String> names = new ArrayList<>(fs.size());
          List<ICustomFunction> funcs = new ArrayList<>(fs.size());
  
          for (Entry<String, Class<? extends ICustomFunction>> en : fs.entrySet()) {
  
              try {
                  names.add(en.getKey());
                  funcs.add(en.getValue().newInstance());
              } catch (Exception e) {
                  log.error(String.format("Cannot create instance of CustomFunction %s", en.getKey()), e);
              }
          }
  
          return names.isEmpty() ? null
                                 : new AggregatingUDFFinder(new DefaultUDFFinder(
                                         names.toArray(new String[names.size()]),
                                         funcs.toArray(new ICustomFunction[funcs.size()])));
      }
docs: Does create a new instance of {@link UDFFinder} based on Set of CustomFunction provided.
  If you extend {@link Functions} class and replace/add {@link #fs} please also replace/add {@link #poifs}.
  UDFFinder instance is needed for some CustomFunction to do evaluation in POI.