\r\n\r\n

java8lambdasの紹介

もしあなたがJavaプログラマーで、java8lambdaについてもっと学びたいと考えているなら、この記事ではlambdaの構文と使用法について深く見ていきます...

もしあなたがJavaプログラマーで、Java8Lambdaについてもっと知りたいと思っているなら、この記事ではlambdaの構文と使い方を深く見ていきます。

java8-lambda-intro

Javaにおけるラムダ式は、クラスのメソッドを式で簡潔に表現する方法です。引数のリストと本体を持っています。ボディは単一の式またはブロックである。通常、インターフェースの実装が必要な場合に使用される。このようなニーズは、通常、呼び出し側のメソッドの引数としてインターフェイスが必要になったときに発生します。

いくつかの簡単なラムダ式

ラムダ式の簡単な例を見てみましょう。

以下は、2つの数値xとyを受け取り、合計を計算するラムダ式である。

(int x,int y) -> x + y;

パラメータタイプを削除し、より簡潔な表現とする。

(x, y) -> x + y;

パラメータを受け取らない関数を定義する。

() -> 404;

次の例も有効で、パラメータを受け取らず、何も返しません。

() -> {}

単一のパラメータでは、パラメータを囲む必要はない。

x -> x + 1

より複雑なコードブロックも可能です。次のラムダは、1行の引数を受け取り、それに対して何らかの処理を行うものです。引数の型は、周囲の文脈から推測されることに注意。

line -> {
String[] x = pattern.split(line)。
return new Player(Integer.parseInt(x[0])),
x[1],
x[2],
x[3],
Integer.parseInt(x[4]));
}

明確で簡潔なコーディング

ラムダ式の使用は、コードを簡潔かつ明確にするのに役立ちます。これを実現するために、Java8のクラスはラムダを多用しています。

リストまたはセットでループする

List、Set、Queueなどのコレクションクラスは、Iterableインターフェースを実装しており、要素に対するループ処理を容易に行うことができます。

名前のリストを宣言する。

List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");

ラムダループリストなし。

for (String name : names) {
System.out.println(名前)。
}

ラムダを使うと、上記のループは次のように書くことができます。

names.forEach(name -> System.out.println(name));

Java 8 のメソッド参照を使用すると、上記はより簡潔に次のように書くことができます。

names.forEach(System.out::println);

地図上のループ

マッピングとは、キーと値の対応付けのことである。マッピングのループは、各(キー、値)マッピングをループすることになります。この文脈でラムダがどのように使われるかを比較します。

まず、地図を定義します。

Map<String,Integer> map = new HashMap<>();
map.put("Atlanta, Georgia", 110);
map.put("Austin, Texas", 115);
map.put("Baltimore, Maryland", 105);
map.put("Birmingham, Alabama", 99);
map.put("Boston, Massachusetts", 98);

によって、従来の方法でマップを循環させることができます。

for (Map.Entry<String,Integer> e : map.entrySet()) {
System.out.println(e.getKey() + " => " + e.getValue());
}

ここでは、ラムダを使って同じことを素早く簡潔に行う方法を紹介します。

map.forEach((k, v) -> System.out.println(k + " => " + v));

機能インターフェイス

ラムダ式の戻り値の型、言い換えれば、次の文のXの型は何ですか?

X x = a -> a + 1;

ラムダ式の戻り値の型は、関数インターフェース、つまり抽象的なメソッドを1つ持つインターフェースである。ラムダ式は、互換性のある抽象的なメソッドを使用してインターフェースに割り当てることができます。以下はその例です。

マルチスレッドタスクの作成

別スレッドで実行されるタスクを作成することを考えてみましょう。タスクをrunnableインターフェースとして定義し、run()メソッドを実装する必要があります。ここで、Runnableは関数インターフェースである。

class MyTask implements Runnable {
...
public void run() {.
// ここでタスクを実装する
System.out.println("現在、別スレッドで実行中");
}
...
}

MyTaskクラスのインスタンスを作成し、新しいスレッドの実行を開始するために使用することができます。

MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();

ラムダを使うと、Runnableを作る処理が非常に簡単になり、上記のタスクの定義は次のように書き換えることができます。

Runnable task = () -> System.out.println("Running in a separate thread now.");

さえも。

Thread thread = new Thread(() -> System.out.println("Running in a separate thread now."));
thread.start();

コンパレータを用いた比較

コンパレータは、与えられた型のオブジェクトを比較するための機能インターフェイスです。compare()という抽象的なメソッドを定義しており、ラムダ式で定義することができる。

以下は、大文字小文字を区別せずに文字列を比較するコンパレータを作成するラムダ式です。

Comparator<String> cmp = (x, y) -> x.compareToIgnoreCase(y);

コンパレータ関数インターフェースのインスタンスを一度作成すれば、必要に応じて再利用することができます。

ここでは、文字列のリストを昇順にソートしています。

List<String> names = Arrays.asList("Joe", "Jack", "James", "Albert");
Collecti***.sort(names, cmp)。
names.forEach(System.out::println);
// プリント
アルバート
ジャック
ジェームス
ジョー

上記のリストがソートされた状態で、次のように binarySearch() メソッドを使って検索を行います。

System.out.println("search(Joe):" + Collecti***.binarySearch(names, "Joe", cmp));
# prints
検索(Joe):3

また、ラムダを使ってリストから最大値、最小値を簡単に計算することができます。

いくつかのデータを定義します。

List<Integer> temps = Arrays.asList(110, 115, 105, 99, 98, 54, 109, 84, 81, 66, 72, 135, 115, 75, 82, 90, 88);

ラムダ式でコンパレータを定義する。

Comparator<Integer> cmpTemp = (x, y) -> Integer.compare(x, y);

を表示し、最大値と最小値をプリントします。

System.out.println("------ Max/Min ------");
System.out.println(Collecti***.max(temps, cmpTemp) + "/" + Collecti***.min(temps, cmpTemp)) を実行します。

GUIプログラミングでの使用

ラムダ式は、GUIプログラミングにおいて、イベントハンドラを実装する際にも非常に有効です。以下は、ボタンクリックハンドラの使用例です。

JButton button = new JButton("Click Me");
button.addActionListener(e -> System.out.println("Button clicked!"));

Java 8でラムダを使うための簡単な紹介です。

Java 8以降、ラムダはあなたの生活を便利にしましたか? 下のコメント欄で説明してください。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ