i have doubt in kotlin rangeTo() and downTo() are ...
# getting-started
t
i have doubt in kotlin rangeTo() and downTo() are two functions if i apply reverse to 1 function i will get same result as another then why need two functions
v
to have better readability
and performance
10 downTo 1
is optimized for iterations, while
(1..10).reversed()
is not
p
I think only IntRange is optimized, Progressions are not. and
10 downto 1
gives you Progression
v
I just checked the byte code, and it turns out that ALL cases are optimized not to use an iterator
@poohbar no,
10 downTo 1
is optimized as well not to allocate an object. Only
step
allocates one.
Copy code
class Main() {
    fun main(args: Array<String>) {
        for(i in (1..10).reversed()) {
            println()
        }

        for(i in 1 .. 10) {
            println()
        }

        for(i in 10 downTo 1) {
            println()
        }

        for(i in 10 downTo 1 step 5) {
            println()
        }
    }
}
Copy code
import kotlin.Metadata;
import kotlin.jvm.internal.Intrinsics;
import kotlin.ranges.IntProgression;
import kotlin.ranges.IntRange;
import kotlin.ranges.RangesKt;
import org.jetbrains.annotations.NotNull;

@Metadata(
   mv = {1, 1, 6},
   bv = {1, 0, 1},
   k = 1,
   d1 = {"\u0000\u001e\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0002\b\u0002\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\u0019\u0010\u0003\u001a\u00020\u00042\f\u0010\u0005\u001a\b\u0012\u0004\u0012\u00020\u00070\u0006¢\u0006\u0002\u0010\b¨\u0006\t"},
   d2 = {"LMain;", "", "()V", "main", "", "args", "", "", "([Ljava/lang/String;)V", "production sources for module gopuzzlers"}
)
public final class Main {
   public final void main(@NotNull String[] args) {
      IntProgression var10000;
      int i;
      int var3;
      int var4;
      label53: {
         Intrinsics.checkParameterIsNotNull(args, "args");
         var10000 = RangesKt.reversed((IntProgression)(new IntRange(1, 10)));
         i = var10000.getFirst();
         var3 = var10000.getLast();
         var4 = var10000.getStep();
         if(var4 > 0) {
            if(i > var3) {
               break label53;
            }
         } else if(i < var3) {
            break label53;
         }

         while(true) {
            System.out.println();
            if(i == var3) {
               break;
            }

            i += var4;
         }
      }

      i = 1;
      byte var5 = 10;
      if(i <= var5) {
         while(true) {
            System.out.println();
            if(i == var5) {
               break;
            }

            ++i;
         }
      }

      i = 10;
      var5 = 1;
      if(i >= var5) {
         while(true) {
            System.out.println();
            if(i == var5) {
               break;
            }

            --i;
         }
      }

      var10000 = RangesKt.step(RangesKt.downTo(10, 1), 5);
      i = var10000.getFirst();
      var3 = var10000.getLast();
      var4 = var10000.getStep();
      if(var4 > 0) {
         if(i > var3) {
            return;
         }
      } else if(i < var3) {
         return;
      }

      while(true) {
         System.out.println();
         if(i == var3) {
            return;
         }

         i += var4;
      }
   }
}