Refactored Codes
java.util.function.Function implementation using modern java.
In this blog, I will show you the different ways to implement java.util.function.Function interface in modern java. You can watch me code these examples on youtube. [embed]https://youtu.be/mODNt9qycyo[/embed] First implementation is using implementation keyword in a regular class
private class FuncImpl implements Function<Person, Integer>{
     @Override
     public Integer apply(final Person person){ return person.getAge(); } 
}
Second way uses anonymous class for implementation.
final Function<Person, Integer> 
    personAge = new Function<Person, Integer>(){ 
                            @Override public Integer apply(final Person person) { return person.getAge(); } 
            };
Third way used lambda with explicit variable-type and variable-name
final Function<Person, Integer> funclam_1 = (Person person) -> { return person.getAge(); };
Fourth way using a lambda where explicit variable type is not provided, variable type is inferred
final Function<Person, Integer> funclam_2 = person -> person.getAge();
Fifth way is to use method reference.
final Function<Person, Integer> funclam_3 = Person::getAge;
This is the class that provides the getAge function
private class Person {
       private final int age;
   public Person(final int age){
       this.age = age;
   }

   public int getAge(){ return this.age; }
   }
Complete code:-
import java.util.function.Function;

public class FunctionImpl {
    private class Person {
        private final int age;
    public Person(final int age){
        this.age = age;
    }

    public int getAge(){ return this.age; }
    }

    //Regular Class version
    private class FuncImpl implements Function<Person, Integer>{
        @Override
    public Integer apply(final Person person){ return person.getAge(); } 
    }

    //Anonymous class version
    final Function<Person, Integer> 
    personAge = new Function<Person, Integer>(){ 
                            @Override public Integer apply(final Person person) { return person.getAge(); } 
            };
    
    //Lambda Version 1 
    final Function<Person, Integer> funclam_1 = (Person person) -> { return person.getAge(); };

    //Lambda Version 2 
    final Function<Person, Integer> funclam_2 = person -> person.getAge();

    //Lambda Version 3
    final Function<Person, Integer> funclam_3 = Person::getAge;

    public static void main(final String... args){
        final FunctionImpl obj = new FunctionImpl();
        final Person person = obj.new Person(100);
    final FuncImpl funcClassImpl = obj.new FuncImpl();

    System.out.println("Age of the person is " + funcClassImpl.apply(person));
    System.out.println("Age of the person is " + obj.personAge.apply(person));
    System.out.println("Age of the person is " + obj.funclam_1.apply(person));
    System.out.println("Age of the person is " + obj.funclam_2.apply(person));
    System.out.println("Age of the person is " + obj.funclam_3.apply(person));


    }
    
}