Java switch Anweisung und break, Kotlin beim Ausdruck ...

Für Java-Switch-Anweisungen

Problem. Was ist das Ergebnis von `countOnes (int [])` beim Aufruf von main (...) `im Java-Code unten (ich habe keine Lust, mich anzuschließen) Also zögern Sie nicht)?

SwitchSample.java


public class SwitchSample {
    public static int countOnes(int[] numbers) {
        int counter = 0;
        for(int number : numbers) {
            switch(number) {
                case 0:
                    System.out.println("ZERO");
                    break;
                case 1:
                    counter++;
                default:
            }
        }
        System.out.println("ONEs: " + counter);
        return counter;
    }

    public static void main(String[] args) {
        System.out.println("count: " + countOnes(new int[] { 1, 2, 3, 2, 1, 0, 3, 2, 1, 0, 4}));
    }
}

Wenn Sie denken, dass die Antwort 2 ist, ist es eine Schande, weil Sie `0``` drücken, während Sie die Anzahl von` `1``` im Array zählen und aus der` `break;` Schleife ausbrechen. Ich bin jedoch in eine Falle geraten.

Pause nach 2 Zeilen;Ist**Entfliehen Sie der switch-Anweisung**Es entweicht nicht der for-Schleife.


 Daher hat das Auftreten von "0" im Array keinen Einfluss auf die Schleifenverarbeitung. "CountOnes (int [])" "ist also die Nummer aller" 1 "im Array. Die Antwort ist 3, weil es zählt.

 Wenn Sie die `` `break;` `` nach dem` `case 0:` `weglassen, wird die switch-Anweisung" durchfallen "und nach dem` `case 1:` ``, 1 ausgeführt Es wird nicht nur die Anzahl der Nullen gezählt.

#### **`Nach der Pause, um ein "Durchfallen" zu verhindern;Es kann Kritik geben, die geschrieben werden sollte, aber es spielt keine Rolle, ob dies nicht der Fall ist.`**
```case 1


 Denken Sie in diesem Beispiel nicht: "Warum ist die Anweisung, die aus der Schleife entweicht, dieselbe wie die Anweisung, die aus der switch-Anweisung entweicht?" Ich denke.
 Wie auch immer, die Frage ist: "In diesem Fall, wie soll ich den Code schreiben, um aus der Schleife auszubrechen?"
 Wenn Sie den Code wie folgt ändern, bricht die switch-Anweisung mit `` `case 0:` `` aus der Schleife aus und die Antwort auf die erste Frage ändert sich in 2.



#### **`SwitchSample.java`**
```java

public class SwitchSample {
    public static int countOnesBeforeZero(int[] numbers) {
        int counter = 0;
        loop: for(int number : numbers) {
            switch(number) {
                case 0:
                    System.out.println("ZERO");
                    break loop;
                case 1:
                    counter++;
                default:
            }
        }
        System.out.println("ONEs: " + counter);
        return counter;
    }
}

Der einzige Unterschied besteht darin, dass der Block der for-Anweisung mit (loop) gekennzeichnet und in der break-Anweisung angegeben ist. Es ist einfach, aber Blockbezeichnungen werden selten benötigt. Ich bin sicher, dass es einige Java-Programmierer gibt, die sagen, dass sie die Grammatik nicht geschrieben haben oder nicht kennen. Ich hatte auch eine vage Erinnerung an die Grammatik und jedes Mal, wenn ich sie schrieb, suchte ich online.

Durchfallen?

Erstens ist die Angabe der aus der C-Sprache abgeleiteten switch-Anweisung, dass die break-Anweisung, wenn sie nicht in die switch-Anweisung geschrieben ist, durch "Durchfallen" der Anweisungen nach der nächsten Fallbezeichnung ausgeführt wird, zu "Anweisung einer einzelnen Fallbezeichnung". Es ist leicht, die Illusion eines Programmierers hervorzurufen, dass "nur ausgeführt wird" und eine große Anzahl von Fehlern verursacht, weil vergessen wurde, die break-Anweisung zu schreiben. Aus diesem Grund wird "Fallthrough" selbst in der heutigen Zeit als Anti-Muster der Programmierung angesehen, und die meisten Programmiersprachen, die in den letzten Jahren populär geworden sind, übernehmen nicht die switch-Anweisung, die "Fallthrough" in den Sprachspezifikationen verursacht. Es ist fast die letzte Generation von Programmiersprachen, durch die JavaScript und PHP fallen, und Java ist die nächstälteste.

Ich habe oben ein wenig geschrieben: "Warum ist die Anweisung, die aus der Schleife entweicht, und die Anweisung, die aus der switch-Anweisung entweicht, dieselbe?" Es scheint, dass der Grund dafür ist, dass Java die Idee geerbt hat, dass es natürlich ist, eine Pause einzulegen, um zu entkommen. Auf der anderen Seite, während die goto-Anweisung verwendet wurde, um aus mehreren Schleifen gleichzeitig in C-Sprache herauszukommen, warum nicht die goto-Anweisung zu Java hinzufügen, das in der Zeit entwickelt wurde, als die Idee der "strukturierten Programmierung" weit verbreitet wurde? Stattdessen habe ich das Konzept eines "beschrifteten Blocks" erstellt und es (wahrscheinlich) möglich gemacht, aus dem Block zu entkommen, indem ich das Etikett mit break angegeben habe. Dies hat die Funktionalität der break-Anweisung in Java geändert. Ich denke, ich hätte nicht dasselbe reservierte Wort wie das Loop-Escape verwenden sollen, um aus der switch-Anweisung zu entkommen.

Für Kotlin beim Ausdruck

Die Zeit ist vergangen und Kotlin wurde als Sprache für Java Virtual Machine (JVM) entwickelt. Die Fall-Through-Switch-Anweisung, die selbst in Scala, der Sprache für die JVM der vorherigen Generation, nicht übernommen wurde, wird in Kotlin nicht übernommen und kann als verbesserter Switch als "Ausdruck" wie Rubys Fall verwendet werden Der Wann-Ausdruck wurde eingeführt. Der when-Ausdruck führt nicht mehrere Blöcke aus, und sein Verhalten ist if (...) {...} else if (...) else if (...) {...} else {.. Es ist fast dasselbe wie Schreiben.} (In Kotlin, wenn Anweisungen auch als Ausdrücke verwendet werden können).

Da der when-Ausdruck nicht mehr durchfällt, gibt es keine Unterbrechung mehr in der when-Ausdrucksspezifikation, und es besteht kein Grund zur Sorge mit der break-Anweisung, die aus der Schleife ausbricht. Daher kann der Code "Zähle die Anzahl von 1s, aber verlasse die Schleife und beende den Prozess, wenn er Null erreicht" wie folgt geschrieben werden.

SwitchSample.kt


object SwitchSample {
    fun countOnesBeforeZero(numbers: IntArray): Int {
        var counter = 0
        for(number in numbers) {
            when(number) {
                0 -> {
                    println("ZERO")
                    break
                }
                1 -> {
                    counter++
                }
                else -> {}
            }
        }
        println("ONEs: $counter")
        return counter
    }

    @JvmStatic
    fun main(args: Array<String>) {
        println("count: " + countOnes(intArrayOf(1, 2, 3, 2, 1, 0, 3, 2, 1, 0, 4)))
    }
}

Sie können erfolgreich mit Kotlin 1.4 erstellen, das kürzlich eine stabile Version veröffentlicht hat.

In Kotlin 1.3 und darunter

'break' and 'continue' are not allowed in 'when' statements. Consider using labels to continue/break from the outer loop

Die Fehlermeldung wird angezeigt und der Build schlägt fehl. "Sie können break und continue in einer when-Anweisung nicht verwenden. Verwenden Sie möglicherweise Beschriftungen für continue / break in Schleifen." ???

Keine Panik. Wenn Ihre Entwicklungsumgebung aus irgendeinem Grund nicht auf Kotlin 1.4 aktualisiert werden kann, schreiben Sie bitte:

SwitchSample.kt


object SwitchSample {
    fun countOnesBeforeZero(numbers: IntArray): Int {
        var counter = 0
        loop@ for(number in numbers) {
            when(number) {
                0 -> {
                    println("ZERO")
                    break@loop
                }
                1 -> {
                    counter++
                }
                else -> {}
            }
        }
        println("ONEs: $counter")
        return counter
    }
}

Beschriften Sie wie bei der Java-Lösung den Block, den Sie maskieren möchten, und geben Sie ihn in der break-Anweisung an. Er wird normal erstellt.

damit? Was bedeutet dieser Artikel?

Die praktischen Informationen in diesem Artikel sind

--Label ist erforderlich, wenn Sie die Schleifensteuerungsunterbrechung in der Java-switch-Anweisung verwenden möchten

Es ist nur (bitteres Lächeln).

[Hier](https://kotlinlang.org/docs/reference/whatsnew14.html#using-break-and-continue-inside] erklärt, warum break / continue ohne ein Label unter Kotlin 1.3 nicht verwendet werden kann. -wenn-Ausdrücke-in-Schleifen enthalten sind) (obwohl ich nicht dachte, dass es genug Erklärung war).

Wenn Sie dieselbe Logik mit if ~ else if ~ else schreiben, ohne when zu verwenden, besteht diese Einschränkung nicht, und break / continue kann auch in Kotlin 1.3 oder niedriger ohne Label verwendet werden. Verwenden Sie als Test die Funktion "if-Ausdruck in when-Ausdruck konvertieren" von Android Studio, schreiben Sie Logik mit der unbeschrifteten break-Anweisung im if-Ausdruck und konvertieren Sie dann den if-Ausdruck in when-Ausdruck. Es war. Dann wurde der Schleifenblock automatisch beschriftet, und eine break-Anweisung mit dieser Beschriftung wurde angezeigt.

Das Label wurde auch vergeben, als ich diese Konvertierung mit dem Kotlin 1.4 Android-Plug-In versuchte, für das kein Label erforderlich sein sollte. Auch wenn sich die Sprachspezifikationen in Kotlin 1.4 ändern, scheint sich der Konvertierungsprozess vorerst nicht zu ändern.

Informationen zu Switch-Alternativen in verschiedenen Programmiersprachen

In letzter Zeit hat die Anzahl der geschriebenen Java-Codes dramatisch abgenommen und liegt nahe an der Situation, in der Kotlin verwendet werden sollte. Wenn Sie also vergessen, break in der when-Anweisung von Kotlin 1.3 oder weniger zu kennzeichnen, tritt ein Fehler auf. Es sieht so aus, als sollte es herauskommen und es korrigieren. Wenn Sie jedoch die Bezeichnung unterbrechen, die für die Unterbrechung der Java-switch-Anweisung erforderlich ist, tritt kein Fehler auf und die Bedeutung ändert sich erheblich. Achten Sie daher darauf, dass Programmierer keinen Java-Code schreiben.

Als ich break in einer switch-Anweisung in einer Schleife verwendet habe, dachte ich, dass die Frage "Für welche Anweisung ist break?" Wahrscheinlich in verschiedenen Programmiersprachen auftritt, weshalb ich diesen Artikel geschrieben habe. Aus diesem Grund habe ich einige Themen zu anderen Programmiersprachen als Java und Kotlin geschrieben, bin aber kein Programmiersprachen-Enthusiast. Daher möchte ich Java und Kotlin vorerst als Hauptverantwortung überlassen und andere Sprachen anderen Autoren überlassen. Überlegen.

Als ich jedoch im Internet suchte, konnte ich keinen Inhalt finden, der mir Sorgen machte, dass die switch-Anweisung in der Schleife unterbrochen wird. In diesem Sinne mag dieser Artikel sehr originell sein (lacht), aber wenn die meisten Programmierer eine Unterbrechung in einer switch-Anweisung sehen, selbst wenn sie sich in einer Schleife befindet, "entweicht diese Unterbrechung der Schleife. Es ist möglicherweise kein Problem, da es selten falsch verstanden wird, da "es möglicherweise eine Pause ist". Als ich zu diesem Punkt kam, stellte ich fest, dass ich mich kaum daran erinnern konnte, Probleme mit diesem Problem zu haben. Man kann also kaum erwarten, dass am Anfang mehr Menschen in die Falle des Problems geraten (bitteres Lächeln).

Verweise

What's New in Kotlin 1.4.0 - Using break and continue inside when expressions included in loops [switch statement-Wikipedia](https://ja.wikipedia.org/wiki/Switch Statement)

Recommended Posts

Java switch Anweisung und break, Kotlin beim Ausdruck ...
Java-Switch-Anweisung
Java if- und switch-Anweisungen
☾ Java / Repeat-Anweisung und Repeat-Steueranweisung
Unterschiede zwischen "Anfänger" Java und Kotlin
[Java] Verzweigungsaufzählung mit switch-Anweisung
[Java] Die Geschichte einer wirklich beängstigenden switch-Anweisung
Konvertierung zwischen Kotlin nullable und Java Optional
Beziehung zwischen Kotlin- und Java-Zugriffsmodifikatoren
[Für Anfänger] Unterschied zwischen Java und Kotlin
Java, if-Anweisung / switch-Anweisung ab Anfänger
Ein Java-Ingenieur verglich Swift, Kotlin und Java.
Zusammenfassung der guten Punkte und Vorsichtsmaßnahmen bei der Konvertierung der Java Android-Anwendung in Kotlin
Kotlin-Funktionen und Lambdas zum Senden an Java-Entwickler
Java 8 startet jetzt ~ für jeden und Lambda-Ausdruck ~
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
[Java] Wenn Sie eine Zeichenfolge in die switch-Anweisung einfügen, müssen Sie sie zu einem konstanten Ausdruck machen
Schalter und EnumMap
Java und JavaScript
XXE und Java
[Java] Lambda-Ausdruck
Java für Anweisung
Java Lambda Ausdruck
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
Verhalten beim Aufrufen von Java-Argumentmethoden mit variabler Länge aus Scala / Kotlin / Java
[Java] Sortiertipps beim Mischen von Zeichenfolgen und Zahlen
[Inhouse-Lernsitzung] Java-Grundlagen - Lambda-Ausdruck und Stream-API - (13.07.2017)
Java-Sprache aus der Sicht von Kotlin und C #
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
[Java] Wann var verwendet werden soll und wann nicht
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
[Java] [Kotlin] Rufen Sie valueOf und Werte von Enum generisch auf