0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【JavaGold】関数型インタフェースとラムダ式

Last updated at Posted at 2024-12-26

関数型インタフェースとラムダ式

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

Function<T, R>

apply(T)

Function<T, R> の抽象メソッド。
T型の引数を受け取って、R型の値を返す処理を実装する。

実装例
package sample;

import java.util.function.Function;

public class Sample {
    public static void main(String[] args) {
        Function<String, Integer> function = string -> Integer.parseInt(string);
        System.out.println(function.apply("12345"));
    }
}
実行結果
12345

andThen(Function<? super R,? extends V>)

前から後ろの順序で実行される。(順次処理)

実装例
package sample;

import java.util.function.Function;

public class Sample {
    public static void main(String[] args) {
        Function<Integetr, Integetr> a = x -> x + 2;
        Function<Integetr, Integetr> b = x -> x * 2;

        Function<Integetr, Integetr> c = a.andThen(b);
        System.out.println(c.apply(10));
        
        System.out.println(a.andThen(b).apply(10));

        System.out.println(b.apply(a.apply(10)));
    }
}
実行結果
24
24
24

compose(Function<? super V,? extends T>)

後ろから前の順序で実行される。(逆順処理)

実装例
package sample;

import java.util.function.Function;

public class Sample {
    public static void main(String[] args) {
        Function<Integetr, Integetr> a = x -> x + 2;
        Function<Integetr, Integetr> b = x -> x * 2;

        Function<Integetr, Integetr> c = a.compose(b);
        System.out.println(c.apply(10));
        
        System.out.println(a.compose(b).apply(10));

        System.out.println(a.apply(b.apply(10)));
    }
}
実行結果
22
22
22

identity()

static メソッド。
apply(T)メソッドに渡した値をそのまま返すFunctionオブジェクトを生成する。

実装例
package sample;

import java.util.function.Function;

public class Sample {
    public static void main(String[] args) {
        Function<String, String> function = Function.identity();
        System.out.println(function.apply("string message"));
    }
}
実行結果
string message

UnaryOperator<T>

Functionの拡張インターフェース。
Functionの型引数が2つとも同じ型、つまり、引数と戻り値の同じ型を返す特別パターン。
1つの値を処理して同じ型の処理を戻す。

実装例
package sample;

import java.util.function.UnaryOperator;

public class Sample {
    public static void main(String[] args) {
        UnaryOperator<String> unary = string -> "[" + string + "]";
        System.out.println(unary.apply("test"));
    }
}
実行結果
[test]

Consumer<T>

accept(T)

Consumer<T>の抽象メソッド。
T型の値を引数に受け取って、戻り値無しの処理を実装する。

実装例
package sample;

import java.util.function.Consumer;

public class Sample {
    public static void main(String[] args) {
        Consumer<String> consumer = string -> System.out.println(string);
        consumer.accept("test");
    }
}
実行結果
test

andThen(Consumer<? super T>)

「andThen() メソッドを実行した Consumer オブジェクト」→「引数で渡した Consumer オブジェクト」の順序で処理を実行する新しい Consumer オブジェクトが生成される。

実装例
package sample;
import java.util.function.Consumer;

public class Sample {
    public static void main(String[] args) {
        Consumer<String> hoge = string -> System.out.println("hoge : " + string);
        Consumer<String> fuga = string -> System.out.println("fuga : " + string);

        Consumer<String> piyo = hoge.andThen(fuga);

        piyo.accept("piyo");
    }
}
実行結果
hoge : piyo
fuga : piyo
実装例
import java.util.List;
import java.util.function.Consumer;

public class Sample {
    public static void main(String[] args) {
        List<String> list = List.of("A", "B", "C");
        Consumer<String> a = System.out::print;
        Consumer<String> b = a.andThen(
                                str -> 
                                System.out.println(":" + str.toLowerCase()
                             );
        list.forEach(b);
    }
}
実行結果
A:a B:b C:c

Supplier<T>

get()

Supplier<T>の抽象メソッド。
T型の値を返す処理を実装する。

実装例
package sample;

import java.util.function.Supplier;

public class Sample {
    public static void main(String[] args) {
        Supplier<String> supplier = () -> "test";
        System.out.println(supplier.get());
    }
}
実行結果
test

Predicate<T>

test(T)

Predicate<T>の抽象メソッド。
T型の値を引数に受け取って、booleanの値を返す処理を実装する。

実装例
package sample;

import java.util.function.Predicate;

public class Sample {
    public static void main(String[] args) {
        Predicate<String> predicate = string -> string.isEmpty();
        System.out.println(predicate.test(""));
        System.out.println(predicate.test("hoge"));
    }
}
実行結果
true
false

isEqual(Object)

引数で受け取ったオブジェクトと等しいかどうかを判定する新しいPredicateオブジェクトを生成する(比較はObject#equals(Object)メソッドが使用される)。
null セーフになっている。

実装例
package sample;

import java.util.function.Predicate;

public class Sample {
    public static void main(String[] args) {
        Predicate<String> isHoge = Predicate.isEqual("hoge");
        System.out.println(isHoge.test("hoge"));
        System.out.println(isHoge.test("fuga"));

        Predicate<Object> isNull = Predicate.isEqual(null);
        System.out.println(isNull.test(null));
        System.out.println(isNull.test("not null"));
    }
}
実行結果
true
false
true
false

and(Predicate<? super T>)

引数で渡したPredicateオブジェクトをAND条件で連結させた新しいPredicateオブジェクトを生成する。

実装例
package sample;

import java.util.function.Predicate;

public class Sample {
    public static void main(String[] args) {
        Predicate<String> isUpperCase = string -> string.matches("[A-Z]+");
        Predicate<String> isAlphabet  = string -> string.matches("[a-zA-Z]+");

        Predicate<String> predicate = isAlphabet.and(isUpperCase);

        System.out.println(predicate.test("HOGE"));
        System.out.println(predicate.test("hoge"));
    }
}
実行結果
true
false

or(Predicate<? super T>)

引数で渡したPredicateオブジェクトをOR条件で連結させた新しいPredicateオブジェクトを生成する。

実装例
package sample;

import java.util.function.Predicate;

public class Sample {
    public static void main(String[] args) {
        Predicate<String> isUpperCase = string -> string.matches("[A-Z]+");
        Predicate<String> isNumber    = string -> string.matches("\\d+");

        Predicate<String> predicate = isNumber.or(isUpperCase);

        System.out.println(predicate.test("HOGE"));
        System.out.println(predicate.test("1234"));
        System.out.println(predicate.test("hoge"));
    }
}
実行結果
true
true
false

negate()

negate() を実行したPredicateオブジェクトを否定する、新しいPredicateオブジェクトが生成される。

実装例
package sample;

import java.util.function.Predicate;

public class Sample {
    public static void main(String[] args) {
        Predicate<String> isEmpty = string -> string.isEmpty();

        Predicate<String> isNotEmpty = isEmpty.negate();

        System.out.println(isNotEmpty.test("hoge"));
        System.out.println(isNotEmpty.test(""));
    }
}
実行結果
true
false

Bi~

  • BiConsumer\<T,U>
  • BiFunction\<T,U,R>
  • BiPredicate\<T,U>
    それぞれ Consumer\<T>Function\<T, R>Predicate\<T, U>の抽象メソッドの引数が2つになっている。

BinaryOperator<T>

BiFunctionの拡張インターフェース。
T型の引数を2 つ受け取ってT型の値を返すapply(T, T)メソッドが抽象メソッドとして存在する。
UnaryOperatorでは1つの引数を受け取っていたのに対して、BinaryOperatorは2つの引数を受け取って、引数と同じ型の処理を戻す。

OperatorFactoryクラス
import java.util.function.BinaryOperator;

public class OperatorFactory {
	public static BinaryOperator<Integer> add(){
		return (a,b) -> a+b;
	}

	public static BinaryOperator<Integer> minus(){
		return (a,b) -> a-b;
	}
}
Sampleクラス
import java.util.function.BinaryOperator;

public class Sample {
	public static void main(String[] args) {
		BinaryOperator<Integer> op = OperatorFactory.add();
		System.out.println(op.apply(10,20));
	}
}
実行結果
30

maxBy(Comparator<? super T>)

apply(T, T)メソッドに渡された2値を、指定したComparatorオブジェクトで比較して大きい方の値を返すBinaryOperatorオブジェクトを生成する。

実装例
package sample;

import java.util.function.BinaryOperator;

public class Sample {
    public static void main(String[] args) {
        BinaryOperator<Integer> maxBy = BinaryOperator.maxBy(Integer::compare);
        int max = maxBy.apply(21, 10);
        System.out.println(max);
    }
}
実行結果
21

minBy(Comparator<? super T>)

実装例
package sample;

import java.util.function.BinaryOperator;

public class Sample {
    public static void main(String[] args) {
        BinaryOperator<Integer> minBy = BinaryOperator.minBy(Integer::compare);
        int min = minBy.apply(21, 10);
        System.out.println(min);
    }
}
実行結果
10

To~FunctionTo~BiFunction

  • ToIntFunction<T>
  • ToLongFunction<T>
  • ToDoubleFunction<T>

それぞれ、T型の値を引数に受け取って、プリミティブ型の値を返すapplyAs~(T)抽象メソッドを持つ。

実装例
package sample;

import java.util.function.ToIntFunction;

public class Sample {
    public static void main(String[] args) {
        ToIntFunction<String> getLength = string -> string.length();
        System.out.println(getLength.applyAsInt("hoge"));
    }
}
実行結果
4
  • ToIntBiFunction<T,U>
  • ToLongBiFunction<T,U>
  • ToDoubleBiFunction<T,U>

それぞれ、To~Functionの引数が2つになったバージョン。

実装例
package sample;

import java.util.function.ToIntBiFunction;

public class Sample {
    public static void main(String[] args) {
        ToIntBiFunction<Integer, Integer> add = (a, b) -> a + b;
        System.out.println(add.applyAsInt(12, 53));
    }
}
実行結果
65

~To***Function

  • IntToDoubleFunction
  • DoubleToIntFunction
  • LongToDoubleFunction
  • DoubleToLongFunction
  • IntToLongFunction
  • LongToIntFunction

それぞれを受け取って***を返すapplyAs***(~)メソッドを抽象メソッドとして持つ。

実装例
package sample;

import java.util.function.IntToDoubleFunction;

public class Sample {
    public static void main(String[] args) {
        IntToDoubleFunction function = i -> (double)i;
        System.out.println(function.applyAsDouble(20));
    }
}
実行結果
20.0

~To***Function

  • ObjIntConsumer<T>
  • ObjLongConsumer<T>
  • ObjDoubleConsumer<T>

それぞれT型の値との値を引数に受け取るaccept(T, ~)メソッドを抽象メソッドとして持つ。

実装例
package sample;

import java.util.Arrays;
import java.util.List;
import java.util.function.ObjIntConsumer;

public class Sample {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("hoge", "fuga", "piyo");

        forEach(list, (value, index) -> {
            System.out.printf("list[%d] = %s%n", index, value);
        });
    }

    public static <T> void forEach(List<T> list, ObjIntConsumer<T> callback) {
        for (int i=0; i<list.size(); i++) {
            callback.accept(list.get(i), i);
        }
    }
}
実行結果
list[0] = hoge
list[1] = fuga
list[2] = piyo
書式の意味
指定子 対応する型 説明
%s string 文字列を出力
%d int 整数を10進法で出力
%f float 実数を出力
%n - 改行
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?