1. 函数式接口声明
 
接口中只能有一个抽象方法@FunctionalInterface 注解不是必须的,但加上它后,如果出现两个或两个以上的抽象方法时编译器会检测错误 
@FunctionalInterface
public interface FunInterface {
    
    public abstract String 
funTest();
}
 
2. 函数式编程 示例
 
public class FunctionalTest {
    public static void main(String
[] a
) {
        test(FunctionalTest
::aaa
);
        test(() -> {
            System
.out
.println("aaa");
            return "aaa";
        });
    }
    private static void test(FunInterface funInterface
) {
        System
.out
.println(funInterface
.funTest());
    }
    private static String 
aaa() {
        System
.out
.println("aaa");
        return "aaa";
    }
}
 
test接收接口类型 对象作为参数。jdk1.8后, 可以简写为传入一个方法。此方法将是函数式接口中唯一抽象方法的具体实现。 
3. 示例
 
public class FunctionalTest {
    public static void main(String
[] a
) {
        
        test(FunctionalTest
::aaa
);
        test(() -> "bbb");
        
        FunctionalTest
.testTwo(FunctionalTest
::aaaTwo
,"参数");
        FunctionalTest
.testTwo(data 
-> data
,"参数2");
    }
    private static void test(FunInterface funInterface
) {
        System
.out
.println(funInterface
.funTest());
    }
    private static void testTwo(FunInterfaceTwo funInterfaceTwo
,String str
) {
        System
.out
.println(funInterfaceTwo
.funTest(str
));
    }
    private static String 
aaa() {
        return "aaa";
    }
    private static String 
aaaTwo(String str
) {
        return str
;
    }
}
@FunctionalInterface
interface FunInterface {
    
    public abstract String 
funTest();
}
@FunctionalInterface
interface FunInterfaceTwo {
    
    public abstract String 
funTest(String str
);
}
 
public class FunctionalTest {
    private String str
;
    public FunctionalTest(String src
) {
        this.str 
= src
;
    }
    public static void main(String
[] a
) {
        FunctionalTest functionalTest 
= new FunctionalTest("你好");
        FunInterfaceTwo funInterfaceTwo 
= new FunInterfaceTwoImpl();
        functionalTest
.testTwo(functionalTest
::aaaTwo
);
        functionalTest
.testTwo(data 
-> {
            System
.out
.println(data
);
        });
        functionalTest
.testTwo(funInterfaceTwo
);
    }
    private void testTwo(FunInterfaceTwo funInterfaceTwo
) {
        funInterfaceTwo
.funTest(this.str
);
    }
    private void aaaTwo(String str
) {
        System
.out
.println(str
);
    }
}
@FunctionalInterface
interface FunInterfaceTwo {
    void funTest(String str
);
}
class FunInterfaceTwoImpl implements FunInterfaceTwo {
    @Override
    public void funTest(String str
) {
        System
.out
.println(str
);
    }
}