Skip to content

定义

把一段代码赋值给一个变量. 比如 code = public void doSomething(String s){sout;} 其中 public 和 方法名都是多余的,对于void来说编译器可以自行判断返回值类型,同样的对于参数s也可以自行判断 对于花括号里面的内容来说,如果只有一行代码可以用 ->代替{}

code = (s)->sout(s); 对于 这块代码 就是lambda表达式 ,而对于code而言就可以理解为lambda类型的变量, 在Java8中所有lambda类型都是一个接口,而lambda表达式就是接口的实现 而这个接口只有一个接口函数,称为函数式接口

比如自定义接口:

java

@FunctionalInterface//标识只能有一个接口方法
public interface MyFunctionInterface {
    void doSomething(String s);
}

@Test
public void lambda() {
    MyFunctionInterface myFunctionInterface = s -> {
        System.out.println("123" + s);
    };
    myFunctionInterface.doSomething("4");//1234
}

//可以看到利用lambda表达式简化了接口的实现所需要的代码(不需要新增类来实现接口中的方法)

  • 成员函数和lambda表达式

//String::length 把String转为其长度 可以更换为e->e.length()

// e->System.out.println(e) == System.out::println

  • 常用的几个jdk内置@FunctionalInterface接口

public interface Consumer

public interface Predicate

public interface BiConsumer<T, U>

public interface Function<T, R>

demo

java

@Test
public void lambda() {
    Consumer<String> consumer = s -> {//不带返回值 void
        System.out.println(s);
        System.out.println(111);
    };
    consumer.accept("s");

    Predicate<String> predicate = s -> {//带返回值 boolean
        System.out.println(111);
        System.out.println(s);
        return false;
    };
    boolean a = predicate.test("a");

    BiConsumer<String, Integer> biConsumer = (k, v) -> {//无返回值 两个入参
        System.out.println(k + "" + v);
    };
    biConsumer.accept("num", 1);

    //将P开头的Person打印出来
    List<Person> personList = Arrays.asList(new Person("Paul"), new Person("Job"));
    test1(person -> System.out.println(person.getName()), person -> person.getName().startsWith("P"), personList);
    personList.stream().filter(person -> person.getName().startsWith("P")).forEach(person -> System.out.println(person.getName()));
}

public static void test1(Consumer<Person> consumer, Predicate<Person> predicate, List<Person> list) {
    list.forEach(person -> {
        if (predicate.test(person)) {
            consumer.accept(person);
        }
    });
}