Java 11 Features with Examples

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: var in 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 .java file
  • Performance/Diagnostics: JFR improvements