JavaGold 主要な関数型インターフェースと使い方

| パッケージ | インタフェース | 戻り値型 | メソッド |
| --- | --- | --- | --- |
| java.util.function | Supplier\<T> | T | get() |
| java.util.function | Consumer\<T> | void | accept(T) |
| java.util.function | BiConsumer\<T, U> | void | accept(T, U) |
| java.util.function | Predicate\<T> | boolean | test(T) |
| java.util.function | BiPredicate\<T, U> | boolean | test(T, U) |
| java.util.function | Function\<T, R> | R | apply(T) |
| java.util.function | BiFunction\<T, U, R> | R | apply(T, U) |
| java.util.function | UnaryOperator\<T> | T | apply(T) |
| java.util.function | BinaryOperator\<T> | T | apply(T, T) |
| java.lang | Runnable | void | run() |
| java.util.concurrent | Callable\<V> | V | call() |


# 各インターフェースの概要とサンプルコード
## 1. Supplier<T>
概要：Supplierは、引数を取らずに結果を供給するためのインターフェースです。T get()メソッドで値を返します。
用途：値の生成や、ランダムな値の提供に利用されます。
```java
Supplier<String> supplier = () -> "Hello, World!";
System.out.println(supplier.get());  // 出力: Hello, World!
```
## 2. Consumer<T>
概要：Consumerは、引数を受け取り、その値に基づいて処理を行います。void accept(T t)メソッドで動作します。
用途：出力やログ記録など、受け取ったデータを処理する際に使います。
```java
Consumer<String> consumer = s -> System.out.println("Consumed: " + s);
consumer.accept("Hello");  // 出力: Consumed: Hello
```
## 3. BiConsumer<T, U>
概要：BiConsumerは2つの引数を受け取り、それを使って処理を行います。void accept(T t, U u)メソッドがあります。
用途：例えばキーと値を一緒に処理するなど、2つのデータを同時に扱う場合に適しています。
```java
BiConsumer<String, Integer> biConsumer = (name, age) -> System.out.println(name + " is " + age + " years old.");
biConsumer.accept("Alice", 30);  // 出力: Alice is 30 years old.
```
## 4. Predicate<T>
概要：Predicateは引数を受け取り、条件に基づいてtrueかfalseを返します。boolean test(T t)メソッドがあります。
用途：フィルタリングや条件判定など、引数を評価する際に使われます。
```java
Predicate<Integer> isPositive = x -> x > 0;
System.out.println(isPositive.test(5));  // 出力: true
```
## 5. BiPredicate<T, U>
概要：BiPredicateは2つの引数を受け取り、条件に基づいてtrueかfalseを返します。boolean test(T t, U u)メソッドがあります。
用途：2つの値を比較して、条件に一致するかを判定する場合に使用します。
```java
BiPredicate<String, String> equals = (s1, s2) -> s1.equals(s2);
System.out.println(equals.test("hello", "hello"));  // 出力: true
```
## 6. Function<T, R>
概要：Functionは引数を受け取り、変換して結果を返します。R apply(T t)メソッドがあります。
用途：データの変換や加工処理に使われます。
```java
Function<String, Integer> lengthFunction = s -> s.length();
System.out.println(lengthFunction.apply("Hello"));  // 出力: 5
```
## 7. BiFunction<T, U, R>
概要：BiFunctionは2つの引数を受け取り、1つの結果を返します。R apply(T t, U u)メソッドがあります。
用途：加算や文字列の連結など、複数の引数から1つの結果を得る場合に利用します。
```java
BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
System.out.println(add.apply(3, 4));  // 出力: 7
```
## 8. UnaryOperator<T>
概要：UnaryOperatorは1つの引数を受け取り、同じ型の結果を返します。Function<T, T>の特殊版です。
用途：型変換なしでの値の更新や操作に使います。
```java
UnaryOperator<Integer> increment = x -> x + 1;
System.out.println(increment.apply(5));  // 出力: 6
```
## 9. BinaryOperator<T>
概要：BinaryOperatorは2つの引数を受け取り、同じ型の結果を返します。BiFunction<T, T, T>の特殊版です。
用途：同じ型の2つの値を処理する場合に使います。
```java
BinaryOperator<Integer> max = (a, b) -> a > b ? a : b;
System.out.println(max.apply(3, 5));  // 出力: 5
```
## 10. Runnable
概要：Runnableは引数も戻り値もなく、void run()メソッドで単純な処理を実行します。
用途：スレッドや並列処理で使用され、処理内容を指定するためのインターフェースです。
```java
Runnable runnable = () -> System.out.println("Running task...");
new Thread(runnable).start();  // 出力: Running task...
```
## 11. Callable<V>
概要：Callableは引数を取らず、call()メソッドで処理を行い、結果を返します。Runnableに似ていますが、結果を返す点が異なります。
用途：スレッドから結果を受け取る場合や例外処理が必要な場合に使用されます。
```java
Callable<String> callable = () -> "Task result";
try {
    System.out.println(callable.call());  // 出力: Task result
} catch (Exception e) {
    e.printStackTrace();
}
```