kotlin

apply{}和kotlin中的代码块

2018-12-24  本文已影响0人  ukyoo

构造对象的时候免不了要进行一些初始化的操作,我们可以使用java提供的构造代码块
使用kotlin后,我们多了别的选择
Standard.kt是kotlin封装好的一个工具类,其中的apply方法为
fun T.apply(block: T.() -> Unit): T { block(); return this }
可以看到返回值返回的是对象本身,很适合对象的初始化操作

htmlService.login(HashMap<String,String>().apply {
     put("1","1")
})

通过AndroidStudio自带的show kotlin byteCode可以查看编译后的.class文件,
方法: Tools ->Koltin -> Show Kotlin ByteCode,点击插件GUI的Decompile

反编译后的文件,可以看到

public final void login() {
      HtmlService var10000 = this.htmlService;
      HashMap var1 = new HashMap();
      HtmlService var4 = var10000;
      var1.put("1", "1");
      var4.login((Map)var1);
   }

   public final void login1() {
      this.htmlService.login((Map)(new HashMap() {
         {
            this.put("1", "1");
         }

         // $FF: bridge method
         public boolean containsValue(String var1) {
            return super.containsValue(var1);
         }

         // $FF: bridge method
         public final boolean containsValue(Object var1) {
            return var1 instanceof String ? this.containsValue((String)var1) : false;
         }

         // $FF: bridge method
         public String getOrDefault(String var1, String var2) {
            return (String)super.getOrDefault(var1, var2);
         }

         // $FF: bridge method
         public final Object getOrDefault(Object var1, Object var2) {
            return var1 instanceof String ? this.getOrDefault((String)var1, (String)var2) : var2;
         }

         // $FF: bridge method
         public boolean containsKey(String var1) {
            return super.containsKey(var1);
         }

         // $FF: bridge method
         public final boolean containsKey(Object var1) {
            return var1 instanceof String ? this.containsKey((String)var1) : false;
         }
        ........
      }));
   }

当然java中的静态代码块,构造代码块,方法代码块在kotlin中也是可以使用的

构造代码块

    void login() {
        new HashMap<String, String>() {
            {
                put("1", "1");
            }
        };
    }
htmlService.login(object : HashMap<String, String>() {
     init {
         put("1", "1")
     }
})

静态代码块

  //java代码
  static{
     int aa =1;
  }

  //kotlin代码
  companion object {   //kotlin的静态代码块
      init{

      }
  }

方法代码块

   //java
   void test(){
        {
            int a = 1;
        }
        a = 2;  //报错
    }

    //kotlin
    fun test(){
        run {
            var a =1
        }
        a =2  //报错
    }

和java中的{}一样,括号中声明的变量作用域仅限于括号内

上一篇下一篇

猜你喜欢

热点阅读