/** 字符串翻转 函数接口 */ @FunctionalInterface public interface FunctionStringReverse { String reverse(String v); }
FunctionStringReverse functionStringReverse = new FunctionStringReverse() { @Override public String reverse(String v) { return null; } };
public class SubClass implements FunctionStringReverse{ @Override public String reverse(String v) { return null; } }
() -> {}java
() 表明请求参数ide
{} 函数体(能够理解为<font color="#f12242">函数接口惟一方法</font>体中的处理逻辑,lambda 表达式必须调用这个惟一的方法,因此能够忽略该方法的名字)函数
/** 1. 字符串打印 函数接口 */ @FunctionalInterface public interface FunctionStringPrintf { void printf(String v); }
@Slf4j public class LambdaTest { @Test public void lambdaStringPrintf() { //2. 实现接口的匿名函数方法 FunctionStringPrintf f = (x) -> log.info("lambda string printf:{}", x); //3. 把接口当成一个实参参数传递 func1(f, "abcdefg"); //4. 跟上面两行是同样的效果,这种书写更加简单 func1((x) -> log.info("lambda string printf:{}", x), "hijklmn"); /* * 5. 静态方法引用(直白点讲,就是使用已经写好的静态方法,例如工具类字符串反转打印, * 由于工具类已经提供了这个方法,就不该该在匿名内部类中再写一次该实现,这是多余的,* * 因此直接引用已有方法便可) */ func1(LambdaTest::printf, "hijklmn"); //6. 5.中静态方法的引用另一种实现,5.中的更简洁) func1((x) -> LambdaTest.printf(x), "hijklmn"); } /** 7. (这个很重要,很重要,很重要-->理解) */ private void func1(FunctionStringPrintf f, String p) { f.printf(p); } /** 8. 提供一个打印字符串的静态方法*/ private static void printf(String p) { log.info("static method reference printf:{}", p); } /** 9. 提供一个打印字符串的非静态方法*/ private void noStaticPrintf(String p) { log.info("static method reference printf:{}", p); } }
按照上面的代码就实现了一个lambda语法的函数接口工具
FunctionStringPrintf f
这是一个函数接口,只要传递进来的方法符合接口函数中的方法就均可以调用。<font color="gren">即2. 中 (x) -> log.info("lambda string printf:{}", x);
有入参无返回,跟1.中接口函数中惟一的方法void printf(String v)
正好(该接口也是有入参无返回)能对应上。</font>那么就能使用方法引用来实现(上述5.和8.就是静态方法的引用实现)
类型描述 示例 代码示例 静态方法引用 类::静态方法名 LambdaTest::printf 某个对象的实例方法引用 实例对象::方法名 new LambdaTest()::noStaticPrintf 某个类型的任意对象的实例方法引用 String::toString() String::compareToIgnoreCase() 构造方法引用 类::new LambdaTest::new 第三种:某个类型的任意对象的实例方法引用code
这种类型是感受是针对Java基本类型、包装类型和String这类而言,若是是这几种状况,能够像静态方法引用同样使用,只是这些方法的实现不是staitc而已。第四种:构造方法引用对象
@FunctionalInterface public interface FunctionConstruct { LambdaMethodReferenceTest construct(String p); }这种类型的函数接口中的惟一方法须要返回实例对象接口