import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; interface Person { int age(); } interface People { T fromList(List ps); List getAges(T people); People module = new People>() { public List fromList(List ps) { return ps; } public List getAges(List people) { return people.stream().map(Person::age).collect(Collectors.toList()); } }; } // run with: // javac Program.java // java -cp . Program public class Program { People P; Program(People P) {this.P = P;} void run() { T people = P.fromList(Arrays.asList(() -> 21, () -> 37)); System.out.println(P.getAges(people)); // print "[21, 37]" } public static void main(String[] args) { new Program<>(People.module).run(); } }