• Lambda学习总结


    参考资料:https://www.bilibili.com/video/av50530058/?p=1

    1. Lambda表达式是什么 ?

      :lambda 是一个匿名函数(对一个接口的匿名实现);

    2.Lambda的组成?

      :参数列表 + 方法体

    // ()  : 参数列表       
    // {} : 方法体
    // -> : 运算符 (Goes to)

    3. Lambda基础语法?

      (这里有实现定义好的几个接口,方法名都为test,根据代码上的注释可以大概可以理解是什么意思,接口在这里不写了)

            //无返回 无参
            LambdaNoReturnNoParam lambda1 = () -> {
                //实现方法的 方法体
                System.out.println("无返回值 无参数!");
            };
            lambda1.test();
    
            //无返回 单个参数
            LambdaNoReturnOneParam lambda2 = (int a) -> {
                System.out.println(a + 1);
            };
            lambda2.test(2);
    
            //无返回 多个参数
            LambdaNoReturnMutipleParam lambda3 = (int a, int b) -> {
                System.out.println(a + b);
            };
            lambda3.test(10,20);
    
            //有返回值 无参数
            LambdaReturnNoParam lambda4 = () -> {
                return 12345;
            };
            int ret = lambda4.test();
            System.out.println(ret);
    
            //有返回值 单个参数
            LambdaReturnOneParam lambda5 = (int a) -> {
                return a + 1;
            };
            System.out.println(lambda5.test(44));
    
            //有返回值 多个参数
            LambdaReturnMutipleParam lambda6 = (int a,int b) -> {
                return a * b;
            };
            System.out.println(lambda6.test(3,6));

    运行结果:

    无返回值 无参数!
    3
    30
    12345
    45
    18

    4. Lambda表达式精简?

    /**
     * Lambda表达式语法精简
     *      1. 参数类型可以省略不写;
     *      2. 当参数只有一个的时候,小括号可以省略
     *      3. 如果方法体只有一条语句,大括号可以省略
     *         如果唯一的一条语句是返回语句,则大括号 和 return应同时省略
     */
    public class Syntax2 {
    
        public static void main(String[] args) {
    
            LambdaReturnMutipleParam lambda = (a,b) -> a*b;
            LambdaReturnOneParam lambda2 = a -> a+1;
    
            System.out.println(lambda.test(4,5));
            System.out.println(lambda2.test(19));
        }
    }

    5. Lambda表达式方法引用?

    /**
     * 方法引用:
     *          可以快速的将一个Lambda表达式的实现指向一个已经是实现的方法.
     *          语法:方法的隶属者::方法名
     *
     *          注意:参数数量、类型,返回值类型,要和接口中定义的方法一致.
     */
    public class Syntax3 {
    
        public static void main(String[] args) {
    
            LambdaReturnOneParam lambda1 = a -> change(a);
    
            //引用了change方法的实现。
            LambdaReturnOneParam lambda2 = Syntax3::change;
        }
    
        public static int change(int a){
            return a + 2;
        }
    }

    6. Lambda构造方法的引用

    public class Syntax4 {
        public static void main(String[] args) {
    
            PersonCreater creater = () -> new Person();
    
            //构造方法的引用:
            PersonCreater creater1 = Person::new;
    
            Person p = creater1.getPerson();
    
            PersonCreater1 creater2 = Person::new;
            Person b = creater2.getPerson("小明",12);
        }
    }
    
    interface PersonCreater{
        Person getPerson();
    }
    interface PersonCreater1{
        Person getPerson(String name,int age);
    }

    7. Lambda表达式的应用?
      7.1  集合排序

    public class Exercase1 {
        public static void main(String[] args) {
            List<Person> list = new ArrayList<>();
    
            list.add(new Person("Coco",12));
            list.add(new Person("Tina",13));
            list.add(new Person("Marry",10));
            list.add(new Person("Lucy",16));
            list.add(new Person("Nana",8));
            list.sort((p1,p2) -> p1.age - p2.age);
            System.out.println(list);
        }
    }
    public class Exercise2 {
    
        public static void main(String[] args) {
            /*set内置排序,有参构造需要一个参数comparator,
            所以在这里提供一个对象的比较规则。
            使用lambda表达式来实现Comparator接口,并实例化一个TreeSet对象*/
            //TreeSet<Person> set = new TreeSet<>((p1,p2) -> p1.age - p2.age);
            TreeSet<Person> set = new TreeSet<>((p1,p2) -> {
                if (p1.age >= p2.age){
                    return 1;
                }else {
                    return -1;
                }
            });
            set.add(new Person("Coco",12));
            set.add(new Person("Tina",13));
            set.add(new Person("Marry",10));
            set.add(new Person("Lucy",10));
            set.add(new Person("Nana",8));
    
            System.out.println(set);
        }
    }

      7.2  集合遍历

    public class Exercise3 {
        public static void main(String[] args) {
            //
            List<Integer> list = new ArrayList<>();
    
            Collections.addAll(list,1,2,3,4,5,6,7,8,9,0);
    
            /*将集合中的每一个元素都带入到方法accept中,构造一个Consumer对象*/
            //list.forEach(System.out::println);
    
            //输出集合中所有的偶数
            list.forEach(ele -> {
                if (ele % 2 == 0){
                    System.out.println(ele);
                }
            });
        }
    }
    /**
     * 删除几何中满足条件的元素
     */
    public class Exercise4 {
    
        public static void main(String[] args) {
    
            List<Person> list = new ArrayList<>();
    
            list.add(new Person("Coco",12));
            list.add(new Person("Tina",13));
            list.add(new Person("Marry",10));
            list.add(new Person("Lucy",16));
            list.add(new Person("Nana",8));
    
            //删除年龄>10的
            Iterator iterator = list.iterator();
            while (iterator.hasNext()){
                Person person = (Person) iterator.next();
                if (person.age > 10){
                    iterator.remove();
                }
            }
            System.out.println(list);
    
            /*Lambda实现
            * 将集合中的每一个元素都带入test方法中,
            * 如果返回值是true,则删除这个元素,构造Predicate对象*/
            list.removeIf(ele -> ele.age <= 10);
            System.out.println(list);
    
        }
    }

      7.3 新建线程

    /**
     * 开辟一条线程
     *      1.继承Thread类
     *      2.new Thread() Runnable接口
     */
    public class Exercise5 {
        public static void main(String[] args) {
    
            Thread t = new Thread(() -> {
                for (int i = 0;i < 10;i++){
                    System.out.println(i);
                }
            });
            t.start();
        }
    }

    8. Java内置的函数式接口(我们拿过来就能用的,不用自己去定义接口)

            //Predicate<T>      :   参数:T,返回值:boolean
            //      IntPredicate    int -> boolean
            //      LongPredicate   long -> boolean
            //      DoublePredicate double -> boolean
    
            //Consumer<T>       :   参数:T,返回值:void
            //      IntConsumer          int -> void
            //      LongConsumer         long -> void
            //      DoubleConsumer       double -> void
    
            //Function<T,R>     :   参数:T,返回值:R
            //      IntFunction<R>      int -> R
            //      LongFunction<R>     long -> R
            //      DoubleFunction<R>   double -> R
            //      IntToLongFunction   int -> double
            //      ...
    
            //Supplier<T>       :   参数:无,返回值:T
            //UnaryOperator<T>  :   参数:T,返回值:T
            //BinaryOperator<T> :   参数:T,T,返回值:T
            //BiFunction<T,U,R> :   参数:T,U,返回值:R
            //BiPredicate<T,U>  :   参数:T,U,返回值:boolean
            //BiConsumer<T,U>   :   参数:T,U,返回值:void

    9.闭包问题?

    public class ClosureDemo {
        public static void main(String[] args) {
    
        }
        private static Supplier<Integer> getNumber(){
    
            int num = 10;
    
            return () -> {
                return num;
            };
        }
    }
    public class ClosureDemo2 {
        public static void main(String[] args) {
    
            //在闭包中引用的 必须是常量,编译时候 ,会默认给个fianl
            int a = 101;
    
            Consumer<Integer> c = ele -> {
                System.out.println(ele);
            };
    
            c.accept(a);
        }
    }
  • 相关阅读:
    MFC中文件的查找、创建、打开、读写等
    使用DOS比较两个txt文件的差异
    HDU
    LIS(两种方法求最长上升子序列)
    7-17 奥运排行榜 (25 分)
    区间DP
    HDU-1864&&HDU-2602(01背包问题)
    HDU-5968异或密码
    Maximum Value(unique函数,lower_bound()函数,upper_bound()函数的使用)
    博弈结论记录
  • 原文地址:https://www.cnblogs.com/lovleo/p/11256824.html
Copyright © 2020-2023  润新知