Javaでは、Stremクラスでよく使われる関数インタフェースは以下の通り。これらの関数インタフェースを経由してラムダ式を使う必要があるが、クラスの型推論があるため、Predicate などの関数インタフェース名や呼び出しメソッドを自分で書くことはない。
- Predicate<T> – 引数Tでboolean型を返す test(T) -> boolean
- Supplier<R> – 引数なし で R型を返す get() -> R
- Consumer<T> – 引数T で void型 accept(T) -> void
- BiConsumer<T,U> – 引数T,U で void型 accept(T,U) -> void
- Function<T,R> – 引数T で R型を返す apply(T) -> R
- BiFunction<T,U,R> – 引数T,U で R型を返す apply(T,U) -> R
import java.util.*;
import java.util.function.Predicate ;
import java.util.function.Supplier ;
import java.util.function.Consumer ;
import java.util.function.BiConsumer ;
import java.util.function.Function ;
import java.util.function.BiFunction ;
public class Main {
public static void main( String[] args ) {
Predicate<Integer> even = (Integer x) -> { return x % 2 == 0 ; } ;
System.out.println( even.test( 10 ) ) ;
// ...filter( x -> x % 2 == 0 )...
Supplier<String> greet = () -> "Hello" ;
System.out.println( greet.get() ) ;
// 1引数の Consumer<T> f = (T t) -> 式 ;
// Consumer は accept で呼び出す
Consumer<Integer> foo = (Integer x) -> System.out.println( x ) ;
foo.accept( 10 ) ;
// ...forEach( x -> System.out.println( x ) ) ;
// 2引数の BiConsumer<T,U> f = (T t , U u) -> 式
BiConsumer<Integer,Integer> bar = (Integer x , Integer y) -> System.out.println( x * y ) ;
bar.accept( 10 , 20 ) ;
// 1引数で値を返す Function<T,R> f = (T t) -> { return 式 }
// Function は apply で呼び出す
Function<Integer,Double> baz = (Integer x) -> Math.sqrt( x ) ;
System.out.println( baz.apply( 5 ) ) ;
// ...map( x -> x*x )...
// 2引数で値を返す BiFunction
BiFunction<Integer,Integer,Double> piyo = (Integer x , Integer y) -> Math.sqrt( x * y ) ;
System.out.println( piyo.apply( 5 , 10 ) ) ;
}
}