String.join works on any Iterable, and Collectors.joining does the same inside a pipeline - both beat manual StringBuilder loops.
var parts = List.of("api", "v2", "users");
System.out.println("String.join = " + String.join("/", parts));
System.out.println("with leading = /" + String.join("/", parts));
System.out.println("stream joining= " + parts.stream().map(String::toUpperCase).collect(Collectors.joining(" > ")));
var csv = "a,b,,c";
System.out.println("split keeps empties: " + Arrays.toString(csv.split(",")));
System.out.println("filtered: " + Arrays.stream(csv.split(",")).filter(s -> !s.isEmpty()).toList());
String.join = api/v2/users
with leading = /api/v2/users
stream joining= API > V2 > USERS
split keeps empties: [a, b, , c]
filtered: [a, b, c]
Run this yourself in the Online Java Compiler, spin up a live REST API in the API Sandbox, or practise with Java interview questions.
Published 2026-07-30