zoukankan      html  css  js  c++  java
  • lamda__从new Thread说起

    有这么个困惑,开启线程不都是继承Thread或重写runnable吗?为什么我是直接new的?这和new A(100)有什么区别?A(100)存的是变量啊为什么这里是'函数'?

    new Thread(()->{
                System.out.println(666);
            }).start();
    

    这里的本质是相当于new Thread(new Runnbale())
    事实上,对于Thread确实是new。里面这个函数则是等于new了个Runnable

    最原始写法

    //原始写法
    class MyRunnable implements Runnable{
    
        @Override
        public void run() {
            System.out.println(666);
        }
    }
    //然后调用是这样的
    new Thread(new MyRunnable()).start();
    

    匿名内部类

    但是上面的太麻烦 ,每次都要显示实现接口,单独创一个类就很累
    就赋予new新功能,让它至少封装在一步
    形式为 new A(){} 在{}里面重写方法

            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(666);
                }
            }).start();
    
    

    总结一下,简化流程大概是这样的,所以也叫“函数式编程”,纯粹的面向功能,直观形象

    进阶

    数组排序,倒序。

    Arrays.sort(new Integer[]{1,2,3,4,19,0},(a,b)-> b-a);
    

    很简洁,这里要实现的其实就一个Compartor比较器
    点开源码,就一个方法

    不熟的话可以从v1写起,大概就是这样

    注意的三个点:

    1. 不能使用int[],没法比较,要用对象
    2. 实现Comparator的时候要加泛型,不然默认是obj,obj直接不能直接-操作
    3. 其实Comparator中除了默认和静态方法,还有一个额外的equals方法。按理来说函数式接口只有一个方法,但由于equals是重写父类obj的所以不算

    总结

    三步走:自己实现接口 >> 匿名内部类 >> lamda
    可以看到lamda确实很方便,甚至高效(v1或者v2都需要泛型)

  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/purexww/p/15265878.html
Copyright © 2011-2022 走看看