JAVA 8の新しい特性の関数式インタフェース(一)

49937 ワード

  • 関数インタフェースはLambda式全体の根源であり、つまり関数インタフェースを理解してこそLambda式をよりよく把握することができる.関数式インタフェースは、1つの抽象的なメソッドしかありませんが、複数の非抽象的なメソッドを持つインタフェースです.つまり、デフォルトの方法と静的な方法もあります.デフォルトのメソッドは、インタフェースの定義にキーワードdefaultを使用します.一般的にいくつかの点を満たすのは関数インタフェースです:
  •               ,(Object public    )              。
    
  •  FunctionalInterface  ,               。 
    
  • JDK1.8以前に存在する関数式インタフェース(1.8以前は一般的に内部クラスで処理される)
  • .
  • java.lang.Runnable
  • java.util.concurrent.Callablejava.security.PrivilegedAction
  • java.util.Comparatorjava.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListener
  • java.awt.event.ActionListenerjavax.swing.event.ChangeListener

  • JDK1.8新規:
  • java.util.function

  • 3.関数インタフェース解析BiConsumer:BiConsumerインタフェースは、acceptメソッドを宣言する関数インタフェースであり、戻り値はありません.この関数インタフェースは、主に予想される操作を宣言するために使用されます.もう1つのandThenメソッドは、BiConsumerを受け入れ、BiConsumerの組合せを返し、手順に従って操作を実行します.いずれかの操作を実行して例外を投げ出すと、コンビネーション操作の呼び出し元に渡されます.この操作を実行して異常を放出した場合、後操作(after)は実行されません.
       public static void main(String[] args) {
            System.out.println("------BiConsumer------");
            BiConsumer<String,String> biConsumer = (x,y)-> System.out.println(x+"--------------"+y);
            BiConsumer<String,String> biConsumer2 = (x,y)-> System.out.println(x+">>>>>>>>"+y);
            biConsumer.accept("JACK","JAVA8");
            biConsumer.andThen(biConsumer2).accept("biConsumer2","JAVA8");
            System.out.println("------BiConsumer------");
        }
    

    出力内容:
    ------BiConsumer------
    JACK--------------JAVA8
    biConsumer2--------------JAVA8
    biConsumer2>>>>>>>>JAVA8
    ------BiConsumer------
    

    BiFunction:BiFunctionインタフェースは関数インタフェースであり、applyメソッドを宣言し、戻り値Rがある.defaultのandThen(Function super R, ? extends V> after)が含まれ、Functionメソッドを受け入れ、結果を返す.
       public static void main(String[] args) {
            System.out.println("------BiFunction------");
            BiFunction<Integer,Integer,Integer>    = (x, y)-> {return  x+y;};
            int result =  biFunction.apply(1,2);
            System.out.println("result:"+result);
            Function<Integer,Integer> function = (x)->{return (x*5);};
            System.out.println("andThen:"+biFunction.andThen(function).apply(8,9));
            System.out.println("------BiFunction------");
        }
    
    ------BiFunction------
    result:3
    andThen:85
    ------BiFunction------
    

    上のresult:3は分かりやすく、1+2、すなわちbiFunctionが実行され、下に出力される85は、biFunction.apply(8,9)が先に実行され、その後実行されるカスタムfunction関数である.最後の計算式は(8+9*5=85)です.
    BinaryOperator:2つの同じタイプのオペレータに作用する操作を表し、オペレータの同じタイプの結果を返します.彼はBiFunctionを継承しているので、BiFunctionのメソッドを使用することができます.
    public class MainTest {
        public static void main(String[] args) {
            System.out.println("------BinaryOperator------");
            BinaryOperator<Integer> binaryOperator = (x,y)->x*y;
            System.out.println("BinaryOperator:"+binaryOperator.apply(3,8));
            Function<Integer,Integer> function1 = (x)->x*8;
            System.out.println("BinaryOperator andThen:" + binaryOperator.andThen(function1).apply(8,10));
            BinaryOperator<Integer> bi = BinaryOperator.maxBy(Comparator.naturalOrder());
            System.out.println("BinaryOperator maxBy:" + (bi.apply(100,99)));
            System.out.println("------BinaryOperator------");
        }
    }
    
    

    出力結果:
    ------BinaryOperator------
    BinaryOperator:24
    BinaryOperator andThen:640
    BinaryOperator maxBy:100
    ------BinaryOperator------
    

    BiPredicate:2つのパラメータを表すboolean値メソッド.このインタフェースは論理演算の関数インタフェースである.比較方法boolean test(T t, U u)、論理と方法and(BiPredicate super T, ? super U> other)、論理非方法negate()、および論理または方法or(BiPredicate super T, ? super U> other)が含まれている.test(T t, U u):パラメータが条件を満たしているかどうかを判断します.and(BiPredicate super T, ? super U> other):同時に満足.negate():非演算、類似"!".or(BiPredicate super T, ? super U> other):または演算.
      public class MainTest {
        public static void main(String[] args) {
            System.out.println("------BiPredicate------");
            BiPredicate<String,String> biPredicate = (x,y)-> x.equals(y);
            BiPredicate<String,String> biPredicate1 = (x,y)-> (x+"2").equals(y);
            System.out.println("False>>>>>:"+biPredicate.test("a","b"));
            System.out.println("True>>>>>:"+biPredicate.test("a","a"));
            //biPredicate biPredicate1      
            System.out.println("and >>>>>:"+biPredicate.and(biPredicate1).test("xxx","xxx2"));
            //negate     ,  "!"
            System.out.println("negate >>>>>:"+biPredicate.negate().test("a","a"));
            System.out.println("negate >>>>>:"+biPredicate.negate().test("a","c"));
            //or  
            System.out.println("or >>>>>:"+biPredicate.or(biPredicate1).test("xxx","xxx2"));
            System.out.println("or >>>>>:"+biPredicate.or(biPredicate1).test("xxx","xx"));
            System.out.println("------BiPredicate------");
        }
    }
    

    出力結果:
    ------BiPredicate------
    False>>>>>:false
    True>>>>>:true
    and >>>>>:false
    negate >>>>>:false
    negate >>>>>:true
    or >>>>>:true
    or >>>>>:false
    ------BiPredicate------
    

    BooleanSupplier:Lambda式で返されるboolean値の結果を受信するboolean値の結果を表すプロバイダ.
     public class MainTest {
        public static void main(String[] args) {
            System.out.println("------BooleanSupplier------");
            BooleanSupplier booleanSupplier = ()->true;
            System.out.println(" booleanSupplier :" + booleanSupplier.getAsBoolean());
            int x=2;
            int y=3;
            BooleanSupplier booleanSupplier1 = ()->x>y;
            System.out.println(" booleanSupplier1 :" + booleanSupplier1.getAsBoolean());
            System.out.println("------BooleanSupplier------");
        }
    }  
    

    出力結果:
    ------BooleanSupplier------
     booleanSupplier :true
     booleanSupplier1 :false
    ------BooleanSupplier------
    

    Consumer:入力パラメータを受け入れて返さない操作を表し、パラメータを与えて消費処理を行い、処理方式は任意の操作であってもよい.
        public class MainTest {
        public static void main(String[] args) {
              System.out.println("------Consumer------");
            Consumer consumer = (m)-> System.out.println(">>>>>"+m);
            consumer.accept("     consumer");
            consumer.andThen(consumer).accept("This is second");
            System.out.println("------Consumer------");  
        }
    }
    

    出力内容:
    ------Consumer------
    >>>>>     consumer
    >>>>>This is second
    >>>>>This is second
    ------Consumer------
    

    DoubleBinaryOperator:2つのdouble値オペレータに作用する操作を表し、1つのdouble値の結果を返します.
      public class MainTest {
      public static void main(String[] args) {
          System.out.println("------DoubleBinaryOperator------");
          DoubleBinaryOperator doubleBinaryOperator = (a,b)->{
              if(a>b){
                 return  a-b;
              }else{
                  return  b-a;
              }
          };
          double d =  doubleBinaryOperator.applyAsDouble(6.1,9.1);
          double d1 =  doubleBinaryOperator.applyAsDouble(61.1,9.1);
          System.out.println("doubleBinaryOperator d>>"+d);
          System.out.println("doubleBinaryOperator d1>>"+d1);
          System.out.println("------DoubleBinaryOperator------");
          }
    }
    

    出力内容:
    ------DoubleBinaryOperator------
    doubleBinaryOperator d>>3.0
    doubleBinaryOperator d1>>52.0
    ------DoubleBinaryOperator------
    

    DoubleConsumer:DoubleConsumerはdouble値パラメータを受け入れる操作を表し、結果は返されません.
       public class MainTest {
       public static void main(String[] args) {
     System.out.println("------DoubleConsumer------");
           DoubleConsumer doubleConsumer = System.out::println;
           doubleConsumer.accept(6.5);
           doubleConsumer.andThen(doubleConsumer).accept(18);
           System.out.println("------DoubleConsumer------");
           }
    }
    

    出力内容:
    ------DoubleConsumer------
    6.5
    18.0
    18.0
    ------DoubleConsumer------
    

    DoubleFunction:double値のパラメータを受け入れる方法を表し、結果を返します.
       public class MainTest {
       public static void main(String[] args) {
           System.out.println("------DoubleFunction------");
           DoubleFunction doubleFunction = (w)->{
               if (w>0){
                   System.out.println(" double  ");
                   return  w*2;
               }else{
                   System.out.println(" double  ");
                   return  w*2;
               }
           };
           System.out.println("DoubleFunction >>>>"+doubleFunction.apply(18));
           System.out.println("DoubleFunction >>>>"+doubleFunction.apply(-18));
           System.out.println("------DoubleFunction------");
           }
    }
    

    出力内容:
    ------DoubleFunction------
     double  
    DoubleFunction >>>>36.0
     double  
    DoubleFunction >>>>-36.0
    ------DoubleFunction------
    

    DoublePredicate:double値パラメータを持つboolean値メソッドを表す.具体的な方法はBiPredicate.
     ```java
    public class MainTest {
    public static void main(String[] args) {
        System.out.println("------DoublePredicate------");
        DoublePredicate doublePredicate = qw->qw>0;
        DoublePredicate doublePredicate2 = qe->qe>0;
        System.out.println("DoublePredicate test====="+doublePredicate.test(-11));
        System.out.println("DoublePredicate negate ====="+doublePredicate.negate().test(-11));
        System.out.println("DoublePredicate  and ====="+doublePredicate.and(doublePredicate2).test(111));
        System.out.println("DoublePredicate  or ====="+doublePredicate.or(doublePredicate2).test(111));
        System.out.println("------DoublePredicate------");
        }
    

    }
        :
    ```java
    ------DoubleFunction------
    ------DoublePredicate------
    DoublePredicate test=====false
    DoublePredicate negate =====true
    DoublePredicate  and =====true
    DoublePredicate  or =====true
    ------DoublePredicate------
    ------DoubleFunction------