code: private List<UserRoles> createUserRoles(final Iterable<String> roleList, final boolean includeEmpty) {
          final List<User> userDetails = getUsers();
          final Map<String, List<String>> userNamesRolesMap = createUsernameRolesMap(roleList);
          final List<UserRoles> userRoles = new ArrayList<>();
  
          for (final User user : userDetails) {
              final String username = user.getUsername();
              final long uid = user.getUid();
              final String securityInfo = user.getSecurityinfo();
              final List<String> roles = userNamesRolesMap.get(username);
  
              if (roles != null) {
                  userRoles.add(new UserRoles(username, uid, securityInfo, roles, user.getFields()));
              } else if (includeEmpty) {
                  userRoles.add(new UserRoles(username, uid, securityInfo, new ArrayList<>(), user.getFields()));
              }
          }
  
          return userRoles;
      }
docs: <p>If includeEmpty is false, returns a list of UserRoles containing only users with one or more of the roles
  listed in roleList. If it is true, the list also includes users without any of the given roles. In either case,
  the UserRoles' roles lists only contain roles contained in roleList.</p>
  <p>Given a role list, it gets all the users belonging to each role then extracts uids from UserReadUserListDetails.
  This should minimize the number of calls to community since it's most likely that num(users) >> num(roles).</p>
  
  @param roleList     List of roles
  @param includeEmpty Whether to include users who have none of the roles in roleList.
  @return List of users and uids, with roles taken from roleList.