forEachもbreakとcontinueができます。

3143 ワード

forEachもbreakとcontinueができます。
このような問題。つまり、彼らはforサイクルではなくforEachを使いたいです。fpなので、とても洋風です。
しかし、彼らはbreakとcontinueを使いたいです。つまり、普通のフロー制御文の中の制御文です。
これはfpではないです。元々はfilterがこの仕事を完成するためのもので、flap Mapがあります。BennyHuoは彼が送った文章の中でもこの方法を言っています。
filterはfpですが、二回も遍歴することになります。そうすると、効率が低いので、急いでくれます。Java 8のStream APIは一回しか経たないです。
しかもfpです。しかし、それはラダの対象が生まれ、超複雑(私は見たことがないので、よく分かりません)を実現します。Ktlinの集合フレームはinlineでlambandを落とすことができます。
どれぐらいのオブジェクトが生まれていませんか?辛い鳥Javaと一緒に汚れを落とすことができますか?
label returnを使うという話があります。

fun main(ags: Array<String>) {
 (0..100).forEach {
  if (50 <= it) return@forEach
  println(it)
 }
}
しかし、彼は実験をしてから、このゲームはcontinueにしか相当しないことが分かりました。つまり、あなたは現在のサイクルから飛び出すしかないです。そしてまた次のラウンドを続けます。
道理を言います。これをよく考えてみれば、見つけられます。その中の道理を明らかにするために、私達は自分で一つのforEachを実現します。

fun Pair<Int, Int>.forEach(block: (Int) -> Unit) {
 for (i in first..second) block.invoke(i)
}
そして呼び出します。

Pair(1, 100).forEach(::println)
持鉄のくせがない。
その後、あなたが関数の中でblockに対してコールしていることが分かります。どのようにリセットしても、このblockからしか飛び出ません。
これはあなたが後でこのブロックを呼び出し続けることに影響しません。つまり、このforサイクルはブロック挙動の影響を受けません。
解がなさそうですが、どうすればいいですか?
じゃ、私があなた達を救いましょう。

fun main(ags: Array<String>) {
 run outside@ {
  (0..20).forEach inside@ {
   if (10 <= it) return@outside
   println(it)
  }
 }
}
コンパイル後の実行結果:

0
1
2
3
4
5
6
7
8
9
Process finished with exit code 0
ね、飛び出す。
labelの名前をはっきりさせることです。

run breaking@ {
 (0..20).forEach continuing@ {
  if (10 <= it) return@breaking
  println(it)
 }
}
上の方はbreakです。運行結果は上の通りです。
これはcontinueです。運行結果はcontineの効果です。効果を明らかにするために、printlnをコピーしました。
それぞれifの前後にあり、効果がよく見えます。

run breaking@ {
 (0..20).forEach continuing@ {
  print(it)
  if (10 <= it) return@continuing
  println(it)
 }
}
実行してください:

00
11
22
33
44
55
66
77
88
99
1011121314151617181920
Process finished with exit code 0
それに一回の反復だけしました。とても綺麗で、効率も高いように見えます。
一回だけの反復をどうやって証明しますか?jd-guiを使って先ほどのコードに逆行しました。結果:

public final class _5Kt
{
 public static final void main(@NotNull String[] args)
 {
  Intrinsics.checkParameterIsNotNull(args, "args");
  int $i$a$1$run;
  Iterable $receiver$iv = (Iterable)new IntRange(0, 20);
  int $i$f$forEach;
  for (Iterator localIterator = $receiver$iv.iterator(); localIterator.hasNext();)
  {
   int element$iv = ((IntIterator)localIterator).nextInt();int it = element$iv;
   int $i$a$1$forEach;
   System.out.print(it);
   if (10 <= it) {
    break;
   }
   System.out.println(it);
  }
 }
}
確かに一回だけです。そしてjd-guiは直接に私の行動をbreakにコンパイルしました。服が合わないですか?
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。