Java のラムダ

Barbara Streisand
リリース: 2024-11-19 16:38:03
オリジナル
516 人が閲覧しました

Lambdas in Java

Java のラムダ

ラムダは宣言されていない関数です。つまり、使用するために明示的に宣言する必要はありません。名前、パラメータ、アクセス修飾子、戻り値の型を指定する必要はありません。基本的に、ラムダは単一のメソッドでインターフェイスを実装する簡単な方法です。

Java におけるラムダ関数の基本構文は次のとおりです。

(args) -> (body)
ログイン後にコピー

(int x, int y) -> { return x * y; }
Aluno display = (Pessoa p) -> { System.out.println(p.idade); }
() -> System.out.println(new Date());
() -> { return 25.789; }
x -> x < 100;
ログイン後にコピー

中括弧は、関数本体に複数のステートメントが含まれる場合にのみ必要です。例:

(int x, int y) -> { return x * y; }
ログイン後にコピー

次のように記述できます:

(int x, int y) -> return x * y;
ログイン後にコピー

どちらの形式でも同じ結果が生成されます。

Lambda 関数はパラメーターを持つことも、まったく持たないこともできます。 Java がパラメータの型を推測するため、パラメータの型を省略することもできます。

  1. パラメータ付き関数 (宣言された型付き):
   (int x, int y) -> { return x * y; }
ログイン後にコピー
  1. パラメータ付き関数 (宣言された型なし):
   (x, y) -> { return x * y; }
ログイン後にコピー
  1. パラメータのない関数:
   () -> System.out.println(new Date());
ログイン後にコピー

return キーワードが使用されない場合、関数の戻り値の型は void:
として推論されます。

(a) -> this.x = a;
ログイン後にコピー

ラムダは匿名クラスとは異なることに注意することが重要です。これは、生成された .class ファイルで確認できます。匿名クラスとは異なり、ラムダは使用ごとに複数の .class ファイルを生成しません。


Java での Lambda のアプリケーション

スレッド

ラムダは、スレッドを操作する際の冗長性を減らすことでコードを簡素化します。

// Implementing the Runnable interface and creating a thread with it
Runnable e = new Runnable() {
    public void run() {
        System.out.println(new Date());
    }
};
new Thread(e).start();

// The same implementation using a lambda expression
Runnable e = () -> System.out.println(new Date());
new Thread(e).start();

// Even more concise
new Thread(
    () -> System.out.println(new Date())
).start();
ログイン後にコピー

コレクション

ラムダは、コレクション内の並べ替えやフィルター処理などの関数を簡素化します。

// Print all elements in a list
List<String> list = Arrays.asList("João", "Ana", "Maria", "Cesar");
for (String s : list) {
    System.out.println(s);
}

// Using lambdas
list.forEach(s -> System.out.println(s));

// Lambda with multiple statements
list.forEach(s -> {
    if (StringUtils.equals("Cesar", s)) {
        System.out.println(s);
    }
});

// Conventional sorting
Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareTo(s2);
    }
});
list.forEach(p -> System.out.println(p));

// Sorting using lambdas
Collections.sort(list, (String s1, String s2) -> s1.compareTo(s2));
list.forEach(p -> System.out.println(p));
ログイン後にコピー

リスナー

ラムダは、オブザーバー設計パターンを実装するリスナーのコードを簡素化します。

// Listening to an action on a button in a Swing window
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Some actions...");
    }
});

// Using lambdas
button.addActionListener((e) -> {
    System.out.println("Some actions...");
});
ログイン後にコピー

汎用関数

ラムダ式をパラメーターとして渡すことで、ラムダを汎用関数で使用して問題を解決できます。

public class Main {
    /*
    * A method that tests a condition
    */
    public static void testExpression(List<String> list, Predicate<String> predicate) {
        list.forEach(n -> {
            if (predicate.test(n)) {
                System.out.println(n);
            }
        });
    }

    /*
    * Calling the method with a lambda
    */
    public static void main(String[] args) {
        List<String> list = Arrays.asList("João", "Ana", "Maria", "Cesar");
        // Prints "Cesar" if it exists
        testExpression(list, (n) -> StringUtils.equals("Cesar", n));
        // Prints the entire list
        testExpression(list, (n) -> true);
        // Prints nothing
        testExpression(list, (n) -> false);
    }
}
ログイン後にコピー

以上がJava のラムダの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート