Constructor References

ClassName::new

ClassName::new picks the constructor that matches the functional interface: Supplier → no-arg constructor, Function → one-arg, BiFunction → two-arg. Arrays work too: int[]::new, String[]::new.

Example

Turning raw strings into objects and collecting into an array.

import java.util.*;
import java.util.function.*;

public class Main {
    public static void main(String[] args) {
        Function<String, Student> byName = Student::new;
        BiFunction<String, Integer, Student> byNameAndMarks = Student::new;

        List<Student> students = List.of("Asha", "Kiran").stream().map(byName).toList();
        System.out.println(students);
        System.out.println(byNameAndMarks.apply("Meera", 91));

        String[] upper = List.of("pune", "goa").stream().map(String::toUpperCase).toArray(String[]::new);
        System.out.println(Arrays.toString(upper) + " length=" + upper.length);

        Supplier<Map<String, Integer>> mapFactory = TreeMap::new;
        Map<String, Integer> m = mapFactory.get();
        m.put("b", 2); m.put("a", 1);
        System.out.println(m);
    }
}

class Student {
    private final String name;
    private final int marks;
    Student(String name) { this(name, 0); }
    Student(String name, int marks) { this.name = name; this.marks = marks; }
    public String toString() { return name + "(" + marks + ")"; }
}

Output

[Asha(0), Kiran(0)]
Meera(91)
[PUNE, GOA] length=2
{a=1, b=2}