関数型インタフェースとラムダ式
パッケージ | インタフェース | 戻り値型 | メソッド |
---|---|---|---|
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つの引数を受け取って、引数と同じ型の処理を戻す。
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;
}
}
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~Function
とTo~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 | - | 改行 |