Lambda表达式

只有一个抽象方法的接口,可以用lambda

格式

(参数列表) -> {方法体}

(String msg) -> {System.out.println("mes = " + mes);}

匿名函数和lambda

匿名函数

    interface Message {
        void print(String mes);
    }

    // 使用匿名函数实现接口方法
    public void testLambda() {
        Message msg = new Message() {
            @Override
            public void print(String mes) {
                System.out.println("mes = " + mes);
            }
        };
        msg.print("hello");
    }

lambda

    interface Message {
        void print(String mes);
    }

    // 使用匿名函数实现接口方法
    public void testLambda() {
        Message message = msg -> System.out.println("msg = " + msg);
        message.print("hello");
    }

格式省略

  • 1.简化参数类型,可以不写参数类型,但是必须所有参数都不写
  • 2.简化参数小括号,如果只有一个参数则可以省略参数小括号
  • 3.简化方法体大括号,如果方法条只有一条语句,则可以胜率方法体大括号
  • 4.简化return,如果只有一条return语句,则可以省略return
    interface Message {
        void print(String mes);
    }


    public int Operation(int a, int b, MathOperation mathOperation) {
        return mathOperation.operation(a, b);
    }

@Test
    public void testLambda() {
        //MathOperation addOperation = (int a, int b) -> {return a + b;};
        MathOperation addOperation = (a, b) -> a + b;

        System.out.println(Operation(10, 5, jianOperation));
    }

@FunctionalInterface

标记接口类为一个函数式接口,要求接口中的抽象方法只有一个,排除多个default默认方法

Lambda创建线程

        // Thread构造器接受Runnable接口
        // 对Runnable接口重写run方法
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("i = " + i);
            }
        });

        thread.start();

Lambda集合操作

遍历

  • list.forEach方法接受Consumer接口作为参数,Consumer接口中有方法void accept(T t),实现它即可
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5);

        list.forEach((Integer element)->{
            if (element % 2 == 0) {
                System.out.println("element = " + element);
            }
        });

条件删除

  • list.removeIf方法接受Predicate函数接口,Predicate接口实现boolean test(T t)即可
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5);

        list.removeIf((Integer element) -> {
            if (element % 2 == 0) {
                return true;
            }
            return false;
        });

        System.out.println("list = " + list); //list = [1, 3, 5]

排序

  • 同理,实现Comparator接口
        ArrayList<Integer> list = new ArrayList<>();
        Collections.addAll(list, 1, 2, 3, 4, 5);

        list.sort((Integer i, Integer j)-> j - i);
        System.out.println("list = " + list);

Lambda闭包问题

  • Lambda使用非final变量会在编译器将该变量置为final变量,修改变量会编译报错
        String str = "message: ";
        Message msgplus = msg -> System.out.println(str + msg);

        // str = "123";  //编译出错,被lambda引用的变量不可赋值
posted @ 2020-11-13 23:13  熊云港  阅读(129)  评论(0)    收藏  举报