web-dev-qa-db-ja.com

Java 8つの関数型インターフェース(Java.util.functionにリストされているものではない)のリストはありますか?

Java 8の機能インターフェイスであるすべてのインターフェイスのリストを取得する方法があるかどうかを確認しようとしています。このページのリストについては話していません。

https://docs.Oracle.com/javase/8/docs/api/Java/util/function/package-summary.html

むしろ、私はComparator、FileFilter、Runnableなどのインターフェイスについて話しています-APIドキュメントが示すインターフェイスは次のように機能します:

@FunctionalInterface public interface Runnable

これらの完全なリストはどこかにありますか?

ありがとうございました!

14
Elisabeth

FunctionalInterfaceのクラスドキュメント を参照して [〜#〜] use]をクリックすると、APIドキュメントで利用可能な_@FunctionalInterface_で注釈が付けられているすべてのインターフェイスのリストがあります。 [〜#〜] 上部のリンク。

ただし、注釈の存在は interfaceを機能インターフェイスにするために必須ではありません であることを強調する必要があります。 _Java.lang.Object_のabstractメソッドと一致しないpublicメソッドが1つだけある各インターフェースは、ラムダ式またはメソッド参照を介して実装できますが、必ずしも結果が特定のinterfaceに指定された追加のコントラクトを満たすことを意味するわけではありません。

JREには技術的な制約を満たす約200のインターフェイス があるため、ラムダ式を介してそれらを実装しようとしても、コンパイラは反対しません。それらのいくつかだけが注釈を持っています。注釈が付いていないものの中には、スムーズに機能するものもあります。 ActionListenerInvocationHandler、またはThreadFactoryですが、ComparableProtocolFamilyFlavorExceptionなどの追加の制約のため、その他は不適切です。これについては、「 JDK内の適格なすべてのインターフェースで@FunctionalInterfaceが使用されないのはなぜですか? 」でも説明されています。

したがって、_@FunctionalInterface_はラムダ式またはメソッド参照のターゲットタイプとして使用できるという意図を文書化していますが、他のインターフェイスタイプも同じ目的に適している場合がありますが、コントラクトを自分で調べて、使用が適切な。

19
Holger

@ GhostCat's Eclipseメソッドを使用して、ランタイムライブラリで@FunctionalInterfaceとマークされたインターフェイスの実際のリストを次に示します(Java.util.function.*を除く)。

Java.awt.KeyEventDispatcher
Java.awt.KeyEventPostProcessor
Java.io.FileFilter
Java.io.FilnameFilter
Java.lang.Runnable
Java.lang.Thread.UncaughtExceptionHandler
Java.nio.file.DirectoryStream.Filter
Java.nio.file.PathMatcher
Java.time.temporal.TemporalAdjuster
Java.time.temporal.TemporalQuery
Java.util.Comparator
Java.util.concurrent.Callable
Java.util.logging.Filter
Java.util.prefs.PreferenceChangeListener
jdk.management.resource.ResourceApprover
jdk.management.resource.ResourceId
6
shmosel

回避策:たとえばEclipseを使用してそのようなリストを収集できる場合があります。

そのアノテーションのソースにジャンプして、その使用法をグローバルに検索するだけです。

または、リフレクションを使用してコードを記述し、JAR内のすべてのクラスをスキャンして、各クラスがそのアノテーションを使用しているかどうかを確認することもできます。それにはいくらかの努力が必要ですが、そこに到達するための大きな障害は見られません。それはただ座ってそれをすることについてです。

しかしもちろん、本当の答えは次のようになります。これはおそらくxyの問題です。そして、私たちはむしろあなたがこれについて知る必要があるとあなたが考える「理由」に焦点を合わせるべきです。

@FunctionalInterfaceのUsesページへのリンクは次のとおりです。 ses of Class @FunctionalInterface

以下は、すべて一般的に使用され、意味的に中立なものであり、引数と戻り値の型とともにリストされています。

ここで利用可能な完全なリスト: 関数型インターフェースのリスト (programming.guide)

実行可能BiConsumer <T、U>  T、U→
  BiFunction <T、U 、R>  T、U→R 
  BinaryOperator <T>  T、T→T 
  BiPredicate <T、U>  T、U→boolean 
  BooleanSupplier →boolean 
  Consumer <T>  T→
  DoubleBinaryOperator  = double、double→double 
  DoubleConsumer  double→
  DoubleFunction <R>  double→R 
  DoublePredicate  double→boolean 
  DoubleSupplier →double 
  DoubleToIntFunction  double→int 
  DoubleToLongFunction  double→long 
  DoubleUnaryOperator  double→double 
  Function <T、R>  T→R 
  IntBinaryOpera tor  int→int 
  IntConsumer  int→
  IntFunction <R>  int→R 
  IntPredicate  int→boolean 
  IntSupplier →int 
  IntToDoubleFunction  int→double 
  IntToLongFunction  = int→long 
  IntUnaryOperator  int→int 
  LongBinaryOperator  long、long→long 
  LongConsumer  = long→
  LongFunction <R>  long→R 
  LongPredicate  long→boolean 
  LongSupplier  =→long 
  LongToDoubleFunction  long→double 
  LongToIntFunction  long→int 
  LongUnaryOperator  long→ long 
  ObjDoubleConsumer <T>  T、double→
  ObjIntConsumer <T>  T、int→
  ObjLongConsumer <T>  T、long→
-  Predicate <T>  T→boolean 
  Supplier <T> →T 
  ToDoubleBiFunction <T、U>  T 、U→double 
  ToDoubleFunction <T>  T→double 
  ToIntBiFunction <T、U>  T、U→int 
  ToIntFunction <T>  T→int 
  ToLongBiFunction <T、U>  T、U→long 
  ToLongFunction <T >  T→long 
  naryOperator <T>  T→T 
0
aioobe