当前位置:网站首页>Let, with, apply, also, run

Let, with, apply, also, run

2022-06-21 17:39:00 Lighthouse @kuaidao

Preface

kotlin Several functions commonly used in development ,let,with,run,apply,also , They are all range functions , The specific use scene is blurred , I don't know how to use . Generic expressions are listed here , After decompilation, the bytecode is compared , Convenient memory

Function name Definition inline Structure The object used in the function body Return value Is it an extension function Applicable scenarios
letfun <T, R> T.let(block: (T) -> R): R = block(this)it Refers to the current object Closure yes It is applicable to the treatment of not being null Operation scenario of
withfun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()this To refer to the current object or omit Closure no Where class objects continuously call class properties and methods
runfun <T, R> T.run(block: T.() -> R): R = block()this To refer to the current object or omit Closure yes Apply to let,with Function any scenario .
applyfun T.apply(block: T.() -> Unit): T { block(); return this }this To refer to the current object or omit this yes builder Where mode is used
alsofun T.also(block: (T) -> Unit): T { block(this); return this }it Refers to the current object this yes builder Where mode is used

Be careful kotlin lambda grammar :

block: (T) -> R lambda Expression declaration .
block: T.() -> R With the receiver lambda Expression declaration , This can be written in block Use in this Keyword represents T Actual parameters Use

fun main() {
    

   val str=123
//① val combinStr=str.let { "$str world" }
//② val combinStr= with(str) {
    
// "$str world"
// }
//③ val combinStr=str.run { "$str world " }

//④ val combinStr=str.apply { "$str world" }

//⑤ val combinStr=str.also { "$str world" }
    println(combinStr)

}

// Generic T/R, [ Enter the reference T return R]

//① fun <T, R> T.let(block: (T) -> R): R = block(this)
//② fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
//③ fun <T, R> T.run(block: T.() -> R): R = block()
//④ fun T.apply(block: T.() -> Unit): T { block(); return this }
//⑤ fun T.also(block: (T) -> Unit): T { block(this); return this }
let

//① fun <T, R> T.let(block: (T) -> R): R = block(this)

fun main() {
    
	val str=123
	val combinStr=str.let {
     "$str world" }
	 println(combinStr)
	}


package letrunwithalsoapply;

import kotlin.Metadata;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {
    1, 6, 0},
   k = 2,
   xi = 2,
   d1 = {
    "\u0000\u0012\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\b\u0002\u001a\u0006\u0010\u0000\u001a\u00020\u0001\u001a/\u0010\u0002\u001a\u0002H\u0003\"\u0004\b\u0000\u0010\u0004\"\u0004\b\u0001\u0010\u0003*\u0002H\u00042\u0012\u0010\u0005\u001a\u000e\u0012\u0004\u0012\u0002H\u0004\u0012\u0004\u0012\u0002H\u00030\u0006¢\u0006\u0002\u0010\u0007¨\u0006\b"},
   d2 = {
    "main", "", "let", "R", "T", "block", "Lkotlin/Function1;", "(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;", "untitled2"}
)
public final class LetRunAlsoWithApplyKt {
    
   public static final void main() {
    
      final int str = 123;
      String combinStr = (String)let(Integer.valueOf(str), (Function1)(new Function1() {
    
         // $FF: synthetic method
         // $FF: bridge method
         public Object invoke(Object var1) {
    
            return this.invoke(((Number)var1).intValue());
         }

         @NotNull
         public final String invoke(int it) {
    
            return str + " world";
         }
      }));
      System.out.println(combinStr);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
    
      main();
   }

   public static final Object let(Object $this$let, @NotNull Function1 block) {
    
      Intrinsics.checkNotNullParameter(block, "block");
      return block.invoke($this$let);
   }

}

with

//② fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

fun main() {
    
	val str=123
	val combinStr= with(str) {
    
        "$str world"
    }
	 println(combinStr)
	}



package letrunwithalsoapply;

import kotlin.Metadata;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {
    1, 6, 0},
   k = 2,
   xi = 2,
   d1 = {
    "\u0000\u0016\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0005\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\u001a\u0006\u0010\u0000\u001a\u00020\u0001\u001a8\u0010\u0002\u001a\u0002H\u0003\"\u0004\b\u0000\u0010\u0004\"\u0004\b\u0001\u0010\u00032\u0006\u0010\u0005\u001a\u0002H\u00042\u0017\u0010\u0006\u001a\u0013\u0012\u0004\u0012\u0002H\u0004\u0012\u0004\u0012\u0002H\u00030\u0007¢\u0006\u0002\b\b¢\u0006\u0002\u0010\t¨\u0006\n"},
   d2 = {
    "main", "", "with", "R", "T", "receiver", "block", "Lkotlin/Function1;", "Lkotlin/ExtensionFunctionType;", "(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;", "untitled2"}
)
public final class LetRunAlsoWithApplyKt {
    
   public static final void main() {
    
      final int str = 123;
      String combinStr = (String)with(Integer.valueOf(str), (Function1)(new Function1() {
    
         // $FF: synthetic method
         // $FF: bridge method
         public Object invoke(Object var1) {
    
            return this.invoke(((Number)var1).intValue());
         }

         @NotNull
         public final String invoke(int $this$with) {
    
            return str + " world";
         }
      }));
      System.out.println(combinStr);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
    
      main();
   }

   public static final Object with(Object receiver, @NotNull Function1 block) {
    
      Intrinsics.checkNotNullParameter(block, "block");
      return block.invoke(receiver);
   }
}
run


```kotlin

//③ fun <T, R> T.run(block: T.() -> R): R = block()

fun main() {
    
	val str=123
	val combinStr=str.run {
     "$str world " }
	 println(combinStr)
	}



package letrunwithalsoapply;

import kotlin.Metadata;
import kotlin.jvm.functions.Function1;
import kotlin.jvm.internal.Intrinsics;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {
    1, 6, 0},
   k = 2,
   xi = 2,
   d1 = {
    "\u0000\u0016\n\u0000\n\u0002\u0010\u0002\n\u0002\b\u0004\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\u001a\u0006\u0010\u0000\u001a\u00020\u0001\u001a4\u0010\u0002\u001a\u0002H\u0003\"\u0004\b\u0000\u0010\u0004\"\u0004\b\u0001\u0010\u0003*\u0002H\u00042\u0017\u0010\u0005\u001a\u0013\u0012\u0004\u0012\u0002H\u0004\u0012\u0004\u0012\u0002H\u00030\u0006¢\u0006\u0002\b\u0007¢\u0006\u0002\u0010\b¨\u0006\t"},
   d2 = {
    "main", "", "run", "R", "T", "block", "Lkotlin/Function1;", "Lkotlin/ExtensionFunctionType;", "(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;", "untitled2"}
)
public final class LetRunAlsoWithApplyKt {
    
   public static final void main() {
    
      final int str = 123;
      String combinStr = (String)run(Integer.valueOf(str), (Function1)(new Function1() {
    
         // $FF: synthetic method
         // $FF: bridge method
         public Object invoke(Object var1) {
    
            return this.invoke(((Number)var1).intValue());
         }

         @NotNull
         public final String invoke(int $this$run) {
    
            return str + " world ";
         }
      }));
      System.out.println(combinStr);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
    
      main();
   }

   public static final Object run(Object $this$run, @NotNull Function1 block) {
    
      Intrinsics.checkNotNullParameter(block, "block");
      return block.invoke($this$run);
   }
}
apply

//④ fun T.apply(block: T.() -> Unit): T { block(); return this }

fun main() {
    
	val str=123
	val combinStr=str.apply {
     "$str world" }
	 println(combinStr)
	}


import kotlin.Metadata;

@Metadata(
   mv = {
    1, 6, 0},
   k = 2,
   xi = 2,
   d1 = {
    "\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {
    "main", "", "untitled2"}
)
public final class LetRunAlsoWithApplyKt {
    
   public static final void main() {
    
      int str = 123;
      int var4 = false;
      (new StringBuilder()).append(str).append(" world").toString();
      System.out.println(str);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
    
      main();
   }
}
also

//⑤fun T.also(block: (T) -> Unit): T { block(this); return this }

fun main() {
    
	val str=123
	 val combinStr=str.also {
     "$str world" }
	 println(combinStr)
	}



package letrunwithalsoapply;

import kotlin.Metadata;

@Metadata(
   mv = {
    1, 6, 0},
   k = 2,
   xi = 2,
   d1 = {
    "\u0000\b\n\u0000\n\u0002\u0010\u0002\n\u0000\u001a\u0006\u0010\u0000\u001a\u00020\u0001¨\u0006\u0002"},
   d2 = {
    "main", "", "untitled2"}
)
public final class LetRunAlsoWithApplyKt {
    
   public static final void main() {
    
      int str = 123;
      int var4 = false;
      (new StringBuilder()).append(str).append(" world").toString();
      System.out.println(str);
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
    
      main();
   }
}
summary

Basically apply and with All you do is call the arguments of the extension function type on the receiver provided to it . apply The function is declared as an extension function of the receiver , and with The function takes it as its first argument . in addition , apply Return to the recipient itself , and with Return call lambda After the results of the . If you don't care about the return value , this The two methods can be used interchangeably Of

Kotlin Series of let、with、run、apply、also Use of functions
this still it? The rational use of with The operator

原网站

版权声明
本文为[Lighthouse @kuaidao]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/172/202206211518337836.html