Refactored: JDK's convention is to use $ as suffix instead of prefix
Refactored: extracted LambdaReifier and LambdaFactoryMethod
Refactored: factory method type is now the same as the invoked type