6

のすべてのインターフェイスの単一の抽象メソッド (SAM) のパラメーターと戻り値の型の表を探していますjava.util.function

4

2 に答える 2

11

以下は、パッケージ内の 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

于 2015-01-27T03:24:53.727 に答える
4

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 つのインターフェイスはIntBinaryOperatorLongBinaryOperatorDoubleBinaryOperatorObjIntConsumer<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と見なすことができます。voidvoid

  • UnaryOperator<T>のエイリアス (Java 用語ではサブインターフェース) ですFunction<T,T>

  • BinaryOperator<T>のエイリアス (Java 用語のサブインターフェース) です。BiFunction<T,T,T>

命名規則

  1. void唯一のパラメーターとして受け取る SAM (単一抽象メソッド) を使用するインターフェイスにConsumerは、名前に接尾辞があります。

  2. 戻る SAM とのインターフェイスには、名前に接尾辞がvoidあります。Supplier

  3. 戻る SAM とのインターフェイスには、名前に接尾辞がbooleanあります。Predicate

  4. 1 つのパラメーターを取り、同じ型を返す SAM とのインターフェイスにはUnaryOperator、名前に接尾辞があります。

  5. 同じ型の 2 つのパラメーターを取り、同じ型を返す SAM とのインターフェイスにはBinaryOperator、名前に接尾辞があります。

  6. 他のすべてのインターフェイスにはFunction、名前に接尾辞があります。

  7. 型の異なる 2 つのパラメーターを受け取る SAM を使用するインターフェイスには、サフィックスのBi前にプレフィックスがあります ( 、BiConsumerBiPredicateなど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>
-

于 2015-01-02T13:56:03.600 に答える