Java 11 is an LTS (Long-Term Support) release that brought practical improvements for day-to-day development: better string utilities, modern HTTP client, easier file handling, and cleaner code with var in lambdas.
1) var in Lambda Parameters
Java 10 introduced var for local variables. Java 11 extends it to lambda parameters, mainly useful when you want to add annotations.
Example: Use var with annotations
import java.util.List;
public class VarInLambda {
public static void main(String[] args) {
List<String> names = List.of("Susil", "Rayaguru", "TrueCode");
names.stream()
.map((var s) -> s.toUpperCase()) // Java 11
.forEach(System.out::println);
}
}
✅ When is this useful?
- When you need annotations like
@Nonnull,@NotBlank, etc. on lambda params.
2) New String Methods: isBlank, lines, strip, repeat
Java 11 made common string tasks much cleaner.
isBlank() (better than trim().isEmpty())
public class StringIsBlankDemo {
public static void main(String[] args) {
System.out.println(" ".isBlank()); // true
System.out.println("abc".isBlank()); // false
}
}
strip(), stripLeading(), stripTrailing() (Unicode-aware)
public class StripDemo {
public static void main(String[] args) {
String s = " hello ";
System.out.println("[" + s.strip() + "]"); // [hello]
}
}
lines() (split into stream of lines)
public class LinesDemo {
public static void main(String[] args) {
String text = "A\nB\nC";
text.lines().forEach(System.out::println);
}
}
repeat(n)
public class RepeatDemo {
public static void main(String[] args) {
System.out.println("=-".repeat(5)); // =-=-=-=-=-
}
}
3) Files.readString() and Files.writeString() (Super Handy)
Before Java 11, file read/write often needed boilerplate. Now it’s one-liners.
Example: Read and write file content
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.charset.StandardCharsets;
public class FilesStringDemo {
public static void main(String[] args) throws Exception {
Path path = Path.of("notes.txt");
Files.writeString(path, "Hello Java 11!\n", StandardCharsets.UTF_8);
String content = Files.readString(path, StandardCharsets.UTF_8);
System.out.println(content);
}
}
4) Predicate.not() for Cleaner Filters
Instead of filter(x -> !condition), Java 11 gives a clean utility.
Example: Remove blank strings from a list
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
public class PredicateNotDemo {
public static void main(String[] args) {
List<String> list = List.of("Java", " ", "", "11", " LTS ");
List<String> cleaned =
list.stream()
.filter(Predicate.not(String::isBlank))
.map(String::strip)
.collect(Collectors.toList());
System.out.println(cleaned); // [Java, 11, LTS]
}
}
5) The New Standard HTTP Client (from java.net.http)
Java 11 standardizes the HTTP Client API (no more depending on Apache HttpClient for basic calls).
Example: Simple GET request
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class HttpClientGetDemo {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://postman-echo.com/get?foo=bar"))
.GET()
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body());
}
}
Example: POST JSON
import java.net.URI;
import java.net.http.*;
import java.nio.charset.StandardCharsets;
public class HttpClientPostDemo {
public static void main(String[] args) throws Exception {
String json = "{\"name\":\"Susil\",\"tech\":\"Java 11\"}";
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://postman-echo.com/post"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8))
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
6) Optional.isEmpty() (Finally!)
Earlier you wrote !optional.isPresent(). Java 11 adds isEmpty().
import java.util.Optional;
public class OptionalDemo {
public static void main(String[] args) {
Optional<String> o1 = Optional.of("Java");
Optional<String> o2 = Optional.empty();
System.out.println(o1.isEmpty()); // false
System.out.println(o2.isEmpty()); // true
}
}
7) Running a Single Java File Without Compilation
For quick scripts, you can now do:
java Hello.java
Example file: Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Run directly with Java 11!");
}
}
✅ Great for demos, explainers, interview tasks, and small utilities.
8) Flight Recorder (JFR) Open Sourced + More Accessible
Java Flight Recorder became far more accessible (useful for profiling and production debugging).
Example commands
java -XX:StartFlightRecording:filename=app.jfr,duration=60s -jar app.jar
jfr print app.jfr
Java 11 Quick Summary Table
- Language & Syntax:
varin lambda params - Core APIs: new String methods,
Predicate.not,Optional.isEmpty - I/O:
Files.readString,Files.writeString - Networking: Standard HTTP Client
- Developer Experience: Run single
.javafile - Performance/Diagnostics: JFR improvements