It seems that for the given task it would be better to get rid of the multiple duplicated if statements by defining a list of the keys to match the input list and use Stream API to generate the string id, e.g. Collectors.joining with delimiter or without the delimiter.
Assuming that there is a single rule to create a part of the id: append "Test Value " + key.toUpperCase(), the implementation may look as follows:
final List<String> keys = Arrays.asList(
    "name", "age" /* and other needed keys*/
);
public String createId(List<String> list) {
    return keys
            .stream()
            .filter(list::contains)
            .map(String::toUpperCase)
            .map(str -> "Test Value " + str)
            .collect(Collectors.joining("_")); // or Collectors.joining()
}
System.out.println(createId(Arrays.asList("age", "name", "surname")));
// output: Test Value NAME_Test Value AGE
If custom parts should be provided for name, age, etc., a Map of matches should be prepared and used, also it may make sense to convert the input list into Set<String to facilitate look-ups:
final Map<String, String> keys = new LinkedHashMap<>(); {
    // fill the map in special order
    keys.put("name", "Name Part");
    keys.put("age", "Test Age");
    /* and other needed keys*/
}
public String createId(List<String> list) {
    Set<String> words = new HashSet<>(list);
    return keys.keySet()
            .stream()
            .filter(words::contains) // faster lookup O(1) at the cost of another collection
            .map(keys::get)
            .collect(Collectors.joining("_")); // or Collectors.joining()
}
System.out.println(createId(Arrays.asList("age", "surname", "name")));
// output: Name Part_Test Age