lambda 基础

1、lambda basic

粗暴点:<font color="#f12242">只包含一个方法的接口,能够称为函数接口(那么就可使用lambda表达式)</font>.例以下图:

/** 字符串翻转 函数接口 */
@FunctionalInterface
public interface FunctionStringReverse {    
   String reverse(String v);
}

Java 中一个接口的实现有2种方式,<font color="#f12242">匿名内部类</font>(记到这个),子类实现

  1. FunctionStringReverse functionStringReverse = new FunctionStringReverse() {
         @Override
         public String reverse(String v) {
             return null;
         }
    };
  2. public class SubClass implements FunctionStringReverse{
         @Override
         public String reverse(String v) {
             return null;
         }
    }

lambda 表达式的结构.以下:

() -> {}java

  • () 表明请求参数ide

    • 单参数时能够省略括号()
  • ->
  • {} 函数体(能够理解为<font color="#f12242">函数接口惟一方法</font>体中的处理逻辑,lambda 表达式必须调用这个惟一的方法,因此能够忽略该方法的名字)函数

    • 方法体只有一条语句时能够省略大括号{}
    • 方法体只有一条语句且有返回值时能够省略return 和 {}

2、进阶

示例1:写一个接口函数并使用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);
    }
}
  1. 按照上面的代码就实现了一个lambda语法的函数接口工具

    • 上述步骤7:FunctionStringPrintf f 这是一个函数接口,只要传递进来的方法符合接口函数中的方法就均可以调用。<font color="gren">即2. 中 (x) -> log.info("lambda string printf:{}", x); 有入参无返回,跟1.中接口函数中惟一的方法void printf(String v)正好(该接口也是有入参无返回)能对应上。</font>那么就能使用方法引用来实现(上述5.和8.就是静态方法的引用实现)

引申出4种模式的方法引用,如图下:

类型描述 示例 代码示例
静态方法引用 类::静态方法名 LambdaTest::printf
某个对象的实例方法引用 实例对象::方法名 new LambdaTest()::noStaticPrintf
某个类型的任意对象的实例方法引用 String::toString() String::compareToIgnoreCase()
构造方法引用 类::new LambdaTest::new

第三种:某个类型的任意对象的实例方法引用code

这种类型是感受是针对Java基本类型、包装类型和String这类而言,若是是这几种状况,能够像静态方法引用同样使用,只是这些方法的实现不是staitc而已。

第四种:构造方法引用对象

@FunctionalInterface
public interface FunctionConstruct {
    LambdaMethodReferenceTest construct(String p);
}

这种类型的函数接口中的惟一方法须要返回实例对象接口

相关文章
相关标签/搜索