Streams and String.join build readable output

String.join works on any Iterable, and Collectors.joining does the same inside a pipeline - both beat manual StringBuilder loops.

Code
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());
Output
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]
Advertisement

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