JDK8 New Features

Published 2026-07-29 09:24 Updated 2026-10-13 17:14 832 words 5 min read ... Page views AI-reviewed An AI proof-read this post, but it still deserves a careful read. AI-rewritten Someone else wrote the original; AI helped me rewrite and polish it.

AI-reviewed An AI proof-read this post, but it still deserves a careful read.

This article summarizes the core features of Java 8, including enumerations, basic usage of variable parameters, and the use of interface default and static methods, functional interfaces, Lambda expressions, method references, and Stream streams. Among them, Lambda expressions and Stream streams significantly improve the simplicity and functionality of the code, support functional programming, and can be used for data processing, filtering, mapping, sorting, statistics and other operations, and parallel streams may be processed in inconsistent order.

JDK 8 New Features

Some common syntax has been introduced in Java 5 and is often used together when learning JDK 8 features.

enumeration

Enumeration is a special type used to represent a fixed set of constants. Enumeration constants must be written at the beginning of the enumeration body.

public enum Week {
    MON("星期一"),
    TUE("星期二"),
    WED("星期三"),
    THU("星期四"),
    FRI("星期五"),
    SAT("星期六"),
    SUN("星期日");

    private final String chineseName;

    Week(String chineseName) {
        this.chineseName = chineseName;
    }

    public String getChineseName() {
        return chineseName;
    }
}

Enumeration constants cannot be added or deleted at will after type definition is completed. The properties of enumerated objects are usually designed to be immutable.

variable parameters

Variable parameters allow you to pass in an indefinite number of arguments of the same type when calling a method. A method can have at most one variable parameter, and it must be at the end of the parameter list.

public class Test {
    public static void method(String text, int... numbers) {
        System.out.println(text);
        for (int number : numbers) {
            System.out.println(number);
        }
    }

    public static void main(String[] args) {
        method("abc", 1, 2, 3, 4);
    }
}

Within a method, variable parameters are used as arrays.

Main features of JDK 8

Interface default and static methods

JDK 8 allows interfaces to define default and static methods. Default method use default Decoration, mainly used to be compatible with existing implementation classes when extending interfaces.

public interface ITest {
    void method();

    default void method1() {
        System.out.println("默认方法");
    }

    static void method2() {
        System.out.println("静态方法");
    }
}

functional interface

An interface that has only one abstract method is called a functional interface. Functional interfaces can contain default methods and static methods because they are not abstract methods.

@FunctionalInterface Annotations are used to verify that the interface meets the requirements of a functional interface.

@FunctionalInterface
public interface ITest {
    void method();

    default void method1() {
        System.out.println("默认方法");
    }
}

Lambda expressions

Lambda expressions are used to succinctly represent the implementation of functional interface abstraction methods. Their basic structure is:

(参数列表) -> { 方法体 }

For example, you can directly provide a thread when creating a thread Runnable Realization of:

new Thread(() -> {
    System.out.println("执行 run 方法");
}).start();

Parameter types can usually be inferred by the compiler. When there is only one statement in the method body, you can omit the braces; if the only statement is a return expression, you can also omit them at the same time return。

Arrays.sort(strings, (s1, s2) -> s1.length() - s2.length());

Lambda expressions are written succinctly, but they must appear where functional interface objects are required.

method reference

Method references can be used when an existing method can complete the operations described by a Lambda expression. Common forms are as follows:

类名::静态方法
类名::实例方法
对象::实例方法
类名::new

Whether a method reference can be used depends on whether the abstract method parameters and return values of the target functional interface are compatible with the referenced method. The method names are not required to be the same.

List<String> list = new ArrayList<>();
Collections.addAll(list, "ab", "cd", "ef");

list.forEach(value -> System.out.println(value));
list.forEach(System.out::println);

list.forEach(Test::upperPrintln);
public class Test {
    public static void upperPrintln(String value) {
        String result = String.valueOf(value.charAt(0)).toUpperCase()
                + value.substring(1);
        System.out.println(result);
    }
}

Stream stream

Stream is used to perform operations such as filtering, mapping, sorting, and aggregation on data sequences. It does not store data directly and usually uses a collection or array as the data source.

traverse element

forEach() Is a termination operation used to consume elements in the stream.

List<Integer> list = Arrays.asList(3, 2, 2, 3, 7, 3, 5);

list.stream().forEach(System.out::println);
list.parallelStream().forEach(System.out::println);

The output order of parallel streams is not necessarily the same as the original set.

mapping element

map() Convert each element to another value and generate a new stream.

list.stream()
        .map(number -> number * 2)
        .forEach(System.out::println);

Filtering and interception

filter() Retain elements based on conditions,limit() Limit the number of results. Depending on the order of operations, the results may be different.

list.stream()
        .limit(3)
        .filter(number -> number > 2)
        .forEach(System.out::println);

list.stream()
        .filter(number -> number > 2)
        .limit(3)
        .forEach(System.out::println);

Sort and de-duplication

sorted() Used for sorting,distinct() Used for weight removal.

list.stream()
        .sorted()
        .distinct()
        .forEach(System.out::println);

gather result

collect() Stream processing results can be collected into a new collection or string.

List<Integer> oddNumbers = list.stream()
        .filter(number -> (number & 1) == 1)
        .collect(Collectors.toList());
System.out.println(oddNumbers);

List<String> words = Arrays.asList("a", "b", "c");
String result = words.stream()
        .collect(Collectors.joining("-"));
System.out.println(result);

statistical quantity

count() Returns the number of elements in the stream.

long count = list.stream()
        .filter(number -> number > 2)
        .count();
System.out.println(count);

Written by AI-rewritten

If you enjoyed this, leave a comment~

Loading...