This took me longer than I'd like to accomplish what should have been a very simple task. I needed a way to turn a tokenlist lowercase and remove the spaces. But str_lowercase:N doesn't exist! And trying to generate the variant failed. Any combination I tried of \MakeLowercase and \tl_remove_all:Nn didn't play nice together. I ended up using two helper functions to get the job done. The solution works so far. I am making this question two fold, for one to document my solution and two, to ask if there is a better way, preferably using expl3 only.
% this function exists to simplify the call for the other, reducing the number of arguments to 1.
\cs_new_protected:Npn \tl_lowercase:N #1
{ \bob_tl_lowercase:No #1 #1 }
% this function and its generated varient cause arguement 2 to expand once
% so it can be accepted by \str_lowercase:n, then sets it to itself
\cs_new_protected:Npn \bob_tl_lowercase:Nn #1#2
{ \tl_set:Nx #1 { \str_lowercase:n {#2} } }
\cs_generate_variant:Nn \bob_tl_lowercase:Nn { No }
% just a example use case function
\tl_new:N \itemfilename
\NewDocumentCommand{\getfilename}{s+m} {
\tl_set:Nn \itemfilename {#2}
\tl_remove_all:Nn \itemfilename {~}
\tl_lowercase:N \itemfilename
\tl_show:N \itemfilename
}

\tl_set:Nx \something {\str_lowercase:V \something}) but cannot construct the first type from the second type (because TeX has the concept of expandability). (I don't know if this is a "common issue"? Did the expl3 documentation make it clear how the macros should be used?) – In that respect, the first (unexpandable) type can compute everything but … – user202729 Jan 08 '22 at 09:38