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 ) ) ; } }