zoukankan      html  css  js  c++  java
  • 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引用的变量不可赋值
    
  • 相关阅读:
    UI第十七讲.图片异步加载(包括第三方), KVO, KVC
    第二十一讲.UICollectionView(集合视图)以及瀑布流效果, 通知中心(NSNotificationCenter).
    UI第十九讲:数据库
    UI第十八讲.初级数据持久化 (沙盒, 简单写入对象, 归解档, NSUserDefaults写入读取文件 )
    第十四讲(下) 可视化方式的实现通讯录.(及storyboard方式)
    第十六讲.网络编程 (HTTP协议)
    wslgit
    MyBatis时间比较
    layer开启与关闭加载层
    MyBatis中choose when正确写法
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/13971845.html
Copyright © 2011-2022 走看看