18 Şubat 2020 Salı

Switch Expressions (Enhanced switch statement ) - JEP 361 - Sonuç Döndüren Switch Kodu

Giriş
Not : Java 17 ile gelen Pattern match for switch yazısına bakabilirsiniz.

Expression sonuç döndüren kod parçası anlamına gelir. Açıklaması şöyle
You can return values from a switch block and hence switch statements became switch expressions

Java 12 ile geliyor.  4 tane yeni özellik getiriyor
1. Expression Kullanma
2. Expression İle Return yani switch labelled rule 
3. Eğer Case Kodu tek satır değilse yield ile return yani switch labelled statement group
4. poly expressions

Dolayısıyla iki farklı return şekli var. 
Açıklaması şöyle
Basically, there were two new styles added, dubbed switch labelled rule and switch labelled statement group.
1. Sadece expression yazmak. Bunun sonucu döndürülür
2. yield kelimesi ile return.

1. Expression Kullanma
expression tek satırlık kod demek.

2. Expression İle Return
expression sonucu otomatik olarak return edilir. Ayrıca return yazmaya gerek yok

Örnek - Switch İle Return
Eskiden şöyle yapardık. Burada return kelimesi kullanılıyor.
boolean isPlayerWinner(PlayedMove player, PlayedMove computer) {
  switch (player) {
    case ROCK:
      return computer == PlayedMove.SCISSORS;
    case PAPER:
      return computer == PlayedMove.ROCK;
    case SCISSORS:
      return computer == PlayedMove.PAPER;
    default:
      throw new IllegalArgumentException();
   }
}
Şimdi artık case den sonra sağ tarafa direkt lambda yazabiliyoruz. Şöyle yaparız. Artık return kelimesini kullanmaya gerek yok. Burada switch kullanımı bir metod içine alınmış. Aslında bu zorunlu değil.
boolean isPlayerWinner(PlayedMove player, PlayedMove computer) {
  return switch (player) {
    case ROCK -> computer == PlayedMove.SCISSORS;
    case PAPER -> computer == PlayedMove.ROCK;
    case SCISSORS -> computer == PlayedMove.PAPER;
    default -> throw new IllegalArgumentException();
  };
}
Örnek - Switch İle Return
Şöyle yaparız. Burada Consumer tipinden bir şey return ediliyor.
Consumer<Event> consumer = switch (event.getEventType()) {
    case ORDER -> e -> handle((OrderEvent) e);
    case INVOICE -> e -> handle((InvoiceEvent) e);
    case PAYMENT -> e -> handle((PaymentEvent) e);
};
consumer.accept(event);
Örnek - Switch İle Return + default kullanımı
Şöyle yaparız. case ifadeleri tüm olasılıkları kapsamadığı için default kullanmak gerekir.
Pair<Boolean, String> val = switch (num) {
    case 0 -> Pair.of(true, "zero!");
    case 1 -> Pair.of(true, "one!");
    default -> Pair.of(false, "unknown :/");
};
Örnek - Switch İle Return
Switch'in sonucunu var olarak atayabiliriz. Şöyle yaparız.
var y = switch (0) {
    case 0 -> '0';
    case 1 -> 0.0F;
    case 2 -> 2L;
    case 3 -> true;
    default -> 4;
};
System.out.println(y);
System.out.println(((Object) y).getClass().getName());
Çıktı olarak şunu alırız.
0
java.lang.Character
3. Yield İle Return - yield keyword on Switch Expressions (Java13) 
Burada arrow syntax yerine yield kelimesi kullanılıyor.  Açıklaması şöyle
If the right-hand side of a single case requires more code, it can be written inside a block, and the value returned using yield:
Açıklaması şöyle
In Java12 , the keyword for returning a value was “break” , like case Monday: break “god dammit";.From Java13 forward, we should be using the yield keyword instead, as case Monday: yield “god dammit";. A mixed usage of the arrow syntax and the yield keyword are also supported
Örnek
Şöyle yaparız. Burada arrow syntax blok şeklinde olduğu için yield kullanılıyor
// print the group of the given planet, and some more info,
// and assign the group of the given planet to a variable
String group = switch (planet) {
  case EARTH, MARS -> {
    System.out.println("inner planet");
    System.out.println("made up mostly of rock");
    yield "inner";
  }
  case JUPITER, SATURN -> {
    System.out.println("outer planet");
    System.out.println("ball of gas");
    yield "outer";
  }
};
Örnek
Şöyle yaparız. Burada sadece yield kullanılıyor. Aslında eski kullanım ile aynı bence
String day = switch(randomDay){
  case 0,1:
    yield "Monday";
  case 2:
    yield "Tuesday";
  ...
  default:
    yield "Unknown";
};
Örnek
Şöyle yaparız. Burada yield ve arrow syntax birlikte kullanılıyor
String getNumber(int number) {
  return switch(number) {
    case 1,2 -> "one or two";
    case 3 -> "three";
    case 4,5,6 -> {
      int i = 0;
      i++;
      yield "for or five or six" + 1;
    }
    default -> "unknown";
  };
}
4. poly expressions
Bu kullanımda switch farklı tipleri döndürebilir.
Örnek
Şöyle yaparız. Burada byte veya short veya int tipinden bir sonuç döndürülebilir.
String str = "2"; var index = switch(str) { case "1" -> { byte b = 1; yield b; } case "2" -> { short s = 2; yield s; } case "3" -> 3; default -> 1; };


Hiç yorum yok:

Yorum Gönder