Hlavní navigace

Nepomenované vzory a premenné v Jave

9. 7. 2024

Sdílet

Java káva hrnek Autor: Root.cz s využitím DALL-E

Java 22 priniesla novú syntax pre prípady, keď nie je vyslovene potrebné pomenovať premenné. Novinku formálne špecifikuje dokument JEP 456: Unnamed Variables & Patterns.

Syntax poznáme z Pythonu alebo z jazyka Go:

vals = [1, 2, 3, 4, 5, 6]

a, b, c, _, _, _ = vals
print(a, b, c)

for _ in range(5):
    print('falcon')

Python umožňuje "zahodiť" hodnotu premennej pri dekonštrukcii alebo pri iterácii.

package main

import "fmt"

func main() {

    words := []string{"sky", "rock", "tool", "forest", "war"}

    for _, word := range words {
        fmt.Println(word)
    }

}

Podobne syntax môžeme použiť, ak nepotrebujeme pri iterácii index v jazyku Go.

import java.util.List;

sealed interface Item permits Book, Rock, Tool {}

record Book() implements Item {}
record Rock() implements Item {}
record Tool() implements Item {}

void main() {

    for (int _ : new int[]{1, 2, 3, 4, 5}) {
        System.out.println("falcon");
    }

    var items = List.of(new Book(), new Rock(), new Rock(), new Tool());

    for (var item : items) {

        switch (item) {
            case Book _ -> System.out.println("it is a book");
            case Rock _ -> System.out.println("it is a rock");
            case Tool _ -> System.out.println("it is a tool");
            default -> System.out.println("unknown");
        }
    }
}

V Jave je možné použiť syntax pri iterácii alebo pri pattern matchingu.

package org.example;

import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class QuitButtonEx extends JFrame {

    public QuitButtonEx() {

        initUI();
    }

    private void initUI() {

        var quitButton = new JButton("Quit");

//        quitButton.addActionListener(new ActionListener() {
//            @Override
//            public void actionPerformed(ActionEvent e) {
//                System.exit(0);
//            }
//        });

        quitButton.addActionListener(_ -> System.exit(0));

        createLayout(quitButton);

        setTitle("Quit button");
        setSize(300, 200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private void createLayout(JComponent... arg) {

        var pane = getContentPane();
        var gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        gl.setHorizontalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
        );

        gl.setVerticalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
        );
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {

            var ex = new QuitButtonEx();
            ex.setVisible(true);
        });
    }
}

Veľmi šikovné je použitie nepomenovanej premennej napríklad pri event handlerch.

Syntax bola po prvý krát zahrnutá v Jave 21 v preview verzii, v Jave 22 bola finalizovaná.

Tato zprávička byla zaslána čtenářem serveru Root.cz pomocí formuláře Přidat zprávičku. Děkujeme!

Našli jste v článku chybu?

Autor zprávičky