のすべてのインターフェイスの単一の抽象メソッド (SAM) のパラメーターと戻り値の型の表を探していますjava.util.function
。
2 に答える
以下は、パッケージ内の 43 のインターフェイスすべてと、その他の注目すべきインターフェイスの表です。このように配置すると、パッケージ内の命名パターンが見やすくなります。このテーブルは、.java クラス ファイル内のコメントとして機能するように設計されています。Eclipse (またはコメント内のクラス名を解決できるその他の IDE) でファイルを開きます。名前にカーソルを合わせると、その javadoc が表示されるはずです。Java ソース コードctrl-click
が適切に添付されている場合は、インターフェースのソース コードが開きます。
(驚いたことに、これは InteliJ では機能しないようです。不足している設定があれば教えてください。)
import java.util.function.Function; //Prevent "which package?" popups
import java.util.function.Predicate;
抽象メソッドが「例外をスローする」と宣言しているインターフェイスは、* で示されます
/* Param\Return void boolean R
---- ------- -
void Runnable BooleanSupplier Supplier<R>
void AutoCloseable* Callable<R>*
T Consumer<T> Predicate<T> Function<T,R>
R UnaryOperator<R>
T, U BiConsumer<T,U> BiPredicate<T,U> BiFunction<T,U,R>
R, R BinaryOperator<R>
int IntConsumer IntPredicate IntFunction<R>
T, int ObjIntConsumer<T>
long LongConsumer LongPredicate LongFunction<R>
T, long ObjLongConsumer<T>
double DoubleConsumer DoublePredicate DoubleFunction<R>
T, double ObjDoubleConsumer<T>
Param\Return int long double
--- ---- ------
void IntSupplier LongSupplier DoubleSupplier
T ToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T>
T,U ToIntBiFunction<T,U> ToLongBiFunction<T,U> ToDoubleBiFunction<T,U>
int IntUnaryOperator IntToLongFunction IntToDoubleFunction
int, int IntBinaryOperator
long LongToIntFunction LongUnaryOperator LongToDoubleFunction
long, long LongBinaryOperator
double DoubleToIntFunction DoubleToLongFunction DoubleUnaryOperator
double, double DoubleBinaryOperator */
使用例:
// Lambda using Runnable
new Thread(() -> System.out.println(Thread.currentThread().getName())).start();
Optional<String> opt = Optional.of("Meh");
// Lambda using Predicate<? super String>;
opt = opt.filter( s->s.equalsIgnoreCase("meh") );
System.out.println(opt+" <-- opt");
// Lambda using Consumer<? super String>;
opt.ifPresent( s->System.out.println(s) );
// Lambda using Function<? super String, ? extends String>;
opt = opt.map(s->s+"!").map(s->s+"!");
System.out.println(opt+" <-- opt");
// Lambda using Supplier<? extends IllegalArgumentException>;
opt.orElseThrow( ()->new IllegalArgumentException("Should not be empty.") );
opt = Optional.empty();
opt.orElseThrow(
()->new IllegalArgumentException("Empty? Who said you could be empty?")
);
Thread-0
Optional[Meh] <-- opt
Meh
Optional[Meh!!] <-- opt
Exception in thread "main" java.lang.IllegalArgumentException:
Empty? Who said you could be empty?
at functionalinterfacestudy.AllLambdas.lambda$6(AllLambdas.java:110)
at functionalinterfacestudy.AllLambdas$$Lambda$7/1392838282.get(Unknown Source)
at java.util.Optional.orElseThrow(Unknown Source)
at functionalinterfacestudy.AllLambdas.main(AllLambdas.java:110)
また、この本ではパッケージにいくつかの詳細な表が掲載されています。
また、大した表ではありませんが、公式パッケージ summeryを読むことは常に良いことです。
JDK には、実際には@FunctionalInterface アノテーションを備えた 57 のインターフェイスがあります。上記以外のものには次のものがあります。
import java.io.FileFilter; // Aren't name collisions fun?
import java.io.FilenameFilter;
import java.util.Comparator;
import java.util.logging.Filter;
/*
Interface Single Abstract Method
--------- ----------------------
KeyEventDispatcher: boolean dispatchKeyEvent(KeyEvent e);
KeyEventPostProcessor: boolean postProcessKeyEvent(KeyEvent e);
FileFilter: boolean accept(File pathname);
FilenameFilter: boolean accept(File dir, String name);
Thread.UncaughtExceptionHandler: void uncaughtException(Thread t, Throwable e);
DirectoryStream<T>.Filter<T>: boolean accept(T entry) throws IOException;
PathMatcher: boolean matches(Path path);
TemporalAdjuster: Temporal adjustInto(Temporal temporal);
TemporalQuery<R>: R queryFrom(TemporalAccessor temporal);
Comparator<T>: int compare(T o1, T o2);
Filter: public boolean isLoggable(LogRecord record);
PreferenceChangeListener: void preferenceChange(PreferenceChangeEvent evt);
*/
@FunctionalInterface
ただし、JDK には、アノテーション ( など)を持たない関数型インターフェイスになるためのすべての要件を満たす多くのインターフェイスがありますAutoClosable
。注釈が欠落しているからといって、それらが機能的なインターフェースとして機能しなくなるわけではありません。インターフェイスが関数インターフェイスの定義に違反している場合に、コンパイラに強制的にエラーをスローさせるために使用されます。ある意味では、インターフェイスを実装するときにオーバーライドする必要がある抽象メソッドのセットを拡張しないという約束です (デフォルト メソッドは常に独自の実装を持っているため、追加してもかまいません)。なぜそれが JDK のすべてのインターフェースで使用されていないのでしょうか?@FunctionalInterface
java.util.function
パッケージには合計43 のインターフェイスがあります。そのうちの 35 個を以下の「一般」表にまとめています (StackOverflow は HTML テーブルをサポートしていないため、プレーンテキストで記述されています)。
General 1
---------
-> Return Type
| R boolean void
V - ------- ----
T Function<T,R> Predicate<T> Consumer<T>
P int IntFunction<R> IntPredicate IntConsumer
a long LongFunction<R> LongPredicate LongConsumer
r double DoubleFunction<R> DoublePredicate DoubleConsumer
a T,U BiFunction<T,U,R> BiPredicate<T,U> BiConsumer<T,U>
m void Supplier<T> BooleanSupplier -
General 2
---------
-> Return Type
| int long double
V --- ---- ------
T ToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T>
P int IntUnaryOperator IntToLongFunction IntToDoubleFunction
a long LongToIntFunction LongUnaryOperator LongToDoubleFunction
r double DoubleToIntFunction DoubleToLongFunction DoubleUnaryOperator
a T,U ToIntBiFunction<T,U> ToLongBiFunction<T,U> ToDoubleBiFunction<T,U>
m void IntSupplier LongSupplier DoubleSupplier
上記の「一般」の表に含まれていない残りの 8 つのインターフェイスはIntBinaryOperator
、LongBinaryOperator
、DoubleBinaryOperator
、ObjIntConsumer<T>
、ObjLongConsumer<T>
、ObjDoubleConsumer<T>
、UnaryOperator<T>
ですBinaryOperator<T>
。それらを次の表に示します。比較しやすいように、関連するインターフェイスも示します。
Operators
---------
-> Return Type
| R
V -
T Function<T,R>
UnaryOperator<T> = Function<T,T>
T,U BiFunction<T,U,R>
BinaryOperator<T> = BiFunction<T,T,T>
P
a int
r ---
a int IntUnaryOperator
m int,int IntBinaryOperator
e
t long
e ----
r long LongUnaryOperator
s long,long LongBinaryOperator
double
------
double DoubleUnaryOperator
double,double DoubleBinaryOperator
Consumers
---------
-> Return Type
| void
V ----
T Consumer<T>
int IntConsumer
long LongConsumer
P double DoubleConsumer
a T,U BiConsumer<T,U>
r T,int ObjIntConsumer<T>
a T,long ObjLongConsumer<T>
m T,double ObjDoubleConsumer<T>
ノート
の型パラメーターは
Supplier<T>
元T
のソース コードにあります (T
は抽象メソッドの戻り値の型です)。R
ただし、事実上同じであるため、この表の列に収まります。上記の「General 1」の表の右下隅のエントリを完了すると、インターフェイス
java.lang.Runnable
と見なすことができます。void
void
UnaryOperator<T>
のエイリアス (Java 用語ではサブインターフェース) ですFunction<T,T>
。BinaryOperator<T>
のエイリアス (Java 用語のサブインターフェース) です。BiFunction<T,T,T>
命名規則
void
唯一のパラメーターとして受け取る SAM (単一抽象メソッド) を使用するインターフェイスにConsumer
は、名前に接尾辞があります。戻る SAM とのインターフェイスには、名前に接尾辞が
void
あります。Supplier
戻る SAM とのインターフェイスには、名前に接尾辞が
boolean
あります。Predicate
1 つのパラメーターを取り、同じ型を返す SAM とのインターフェイスには
UnaryOperator
、名前に接尾辞があります。同じ型の 2 つのパラメーターを取り、同じ型を返す SAM とのインターフェイスには
BinaryOperator
、名前に接尾辞があります。他のすべてのインターフェイスには
Function
、名前に接尾辞があります。型の異なる 2 つのパラメーターを受け取る SAM を使用するインターフェイスには、サフィックスの
Bi
前にプレフィックスがあります ( 、BiConsumer
、BiPredicate
などBiFunction
)。
上の表を別の形式で示します (上の表はモバイル デバイスではうまく表示されない可能性があるため):
P
a
r
a
m
T
int
long
double
T,U
void
Return Type
R
-----------------
Function<T,R>
IntFunction<R>
LongFunction<R>
DoubleFunction<R>
BiFunction<T,U,R>
Supplier<T>
P
a
r
a
m
T
int
long
double
T,U
void
Return Type
int
--------------------
ToIntFunction<T>
IntUnaryOperator
LongToIntFunction
DoubleToIntFunction
ToIntBiFunction<T,U>
IntSupplier
P
a
r
a
m
T
int
long
double
T,U
void
Return Type
long
---------------------
ToLongFunction<T>
IntToLongFunction
LongUnaryOperator
DoubleToLongFunction
ToLongBiFunction<T,U>
LongSupplier
P
a
r
a
m
T
int
long
double
T,U
void
Return Type
double
-----------------------
ToDoubleFunction<T>
IntToDoubleFunction
LongToDoubleFunction
DoubleUnaryOperator
ToDoubleBiFunction<T,U>
DoubleSupplier
P
a
r
a
m
T
int
long
double
T,U
void
Return Type
boolean
----------------
Predicate<T>
IntPredicate
LongPredicate
DoublePredicate
BiPredicate<T,U>
BooleanSupplier
P
a
r
a
m
T
int
long
double
T,U
void
Return Type
void
---------------
Consumer<T>
IntConsumer
LongConsumer
DoubleConsumer
BiConsumer<T,U>
-