1、Function函数
public static void main(String[] args) { TestController t = new TestController(); new TestController().aaa(3,value -> t.bbb(value)); } public int bbb(int b){ return b+100; } public void aaa(int a,Function<Integer,Integer> f){ Object apply = f.apply(a); System.out.println("ggg:"+apply); }
2、函数式接口@FunctionalInterface
所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。
特点
- 接口有且仅有一个抽象方法
- 允许定义静态方法
- 允许定义默认方法
- 允许java.lang.Object中的public方法
- 该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错
// 正确的函数式接口 @FunctionalInterface public interface TestInterface { // 抽象方法 public void sub(); // java.lang.Object中的public方法 public boolean equals(Object var1); // 默认方法 public default void defaultMethod(){ } // 静态方法 public static void staticMethod(){ } }
测试
class Test{ public static void main(String[] args) { TwoPinPlug twoPinPlug = new TwoPinPlug(); //lamda定义匿名对象,需要在别的方法调用它,并把参数传给它。 //在TwoPinPlug.getTowPinSocket方法调用lamda匿名对象方法,并传给它参数 twoPinPlug.getTowPinSocket(a -> { //业务处理 System.out.println("我是2脚插头..."); return "2脚插头"; }); } } /** * 插座接口 */ @FunctionalInterface interface Socket{ String getPin(String pin); } /** * 2脚插头 */ class TwoPinPlug { /** * 2脚插头获取对应的2脚插座 * @param socket * @return */ public String getTowPinSocket(Socket socket){ String pin = socket.getPin("2"); System.out.println("获取2脚插头..."); return pin; } }
3、lamda表达式要传多小个参数?
class Test{ public static void main(String[] args) { //因为函数接口抽象方法有2个参数,所以这里要定义2参数。匿名类 doTest((p1,p2)->{ System.out.println("业务逻辑"); return ""; }); } public static void doTest(TestFunctionalInterface testFunctionalInterface){ testFunctionalInterface.testMethod("aaa","bbb"); } } /** * 函数接口 */ @FunctionalInterface interface TestFunctionalInterface{ String testMethod(String p1,String p2); }