JAva 8関数の導出

4874 ワード

前に書く-関数の導出
1.静的方法の導出2.例のある方法は第4部を参照3.構造方法は第5部及びその他を参照
1 consumerインタフェースtest
consumerインタフェースの使用方法を定義します
private static  void useConsumer(Consumer consumer, T t) {
        consumer.accept(t);
    }

メソッド導出プロセス
    	Consumer consumer = (s) -> System.out.println(s);
        useConsumer(consumer, "Hello test1");

        useConsumer(s -> System.out.println(s), "Hello Alex");

	//     ,  consumer    accept   void  , print                         
        useConsumer(System.out::println, "Hello Wangwenjun");

2 listインタフェースの出力
        List list = Arrays.asList(new Apple("abc", 123), new Apple("Green", 110), new Apple("red", 123));
        System.out.println(list);
        list.sort((a1, a2) -> a1.getColor().compareTo(a2.getColor()));
        System.out.println(list);
        list.stream().forEach(a -> System.out.println(a));
        System.out.println("==========================");
        list.stream().forEach(System.out::println);

出力内容は以下の通り
[Apple{color='abc', weight=123}, Apple{color='Green', weight=110}, Apple{color='red', weight=123}]
[Apple{color='Green', weight=110}, Apple{color='abc', weight=123}, Apple{color='red', weight=123}]
Apple{color='Green', weight=110}
Apple{color='abc', weight=123}
Apple{color='red', weight=123}

ここでforEachメソッドはarrayListにおいてソースコードが以下の通りである、すなわちリスト毎のオブジェクトをループし、Consumerのacceptメソッド、すなわちConsumerインタフェースの実装クラスに転送することでこのメソッドを使用することができ、さらにこのような関数を用いて導出する方法を用いてvoidタイプを返し、
@Override
public void forEach(Consumer super E> action) {
    Objects.requireNonNull(action);
    for (E e : a) {
        action.accept(e);
    }
}

3 FunctionインタフェースApplyの方法の導出
まずFunctionインタフェースのソース定義を見てみましょう
@FunctionalInterface
public interface Function {
    R apply(T t);
    }

すなわち、あるタイプに転送され、別のタイプに戻り、次にこのインタフェースを使用して、転送Stringを完了し、Intのような機能に戻ります.
	//1.        
    private static  R useApply(T input,Function f){
        return f.apply(input);
    }
    //2.            
        Integer integer1 = useApply("123", s -> Integer.parseInt(s));
   //3.           
        Integer integer = useApply("321", Integer::parseInt);


上のテスト部分もこのように書くことができて、上のいくつかは基本的に匿名の内部クラスの一環で関数の導出を行って、もちろん関数の導出の方式を使って直接インタフェースに対して実現することができます
//         ,           ,     ,
Function f = Integer::parseInt;
Integer result = f.apply("123");
System.out.println(result);

4インスタンスオブジェクトのメソッドを使用してtestを導出する
        String string = new String("Hello");
        Function function = string::charAt;
        System.out.println(function.apply(2));

出力結果はl、すなわち3番目のアルファベット
5構造関数の導出
        //      ,  supplier      
        Supplier supplier = String::new;
        String s = supplier.get();
        System.out.println(s);

		//           BiFunction  ,apple     String Long,  BiFunction
        BiFunction appleFuntion = Apple::new;
        Apple apple = appleFuntion.apply("red", 100L);
        System.out.println(apple);

6マルチパラメータ構造関数の導出
BiFunctionのようなインタフェースを自分で作成することができます.
6.1関数実体クラスを構築し、三つのパラメータ構造を導入する
public class ComplexApple
{

    private String color;

    private long weight;

    private String name;

    public ComplexApple(String color, long weight, String name) {
        this.color = color;
        this.weight = weight;
        this.name = name;
    }

    public String getColor() {
        return color;
    }

    public long getWeight() {
        return weight;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "ComplexApple{" +
                "name='" + name + '\'' +
                ", weight=" + weight +
                ", color='" + color + '\'' +
                '}';
    }
}

6.2 function Interfaceの構築
@FunctionalInterface
public interface ThreeFunction {

    R apply(T t, U u, K k);

}

6.3導出コード
        ThreeFunction threeFunction = ComplexApple::new;
        ComplexApple complexApple = threeFunction.apply("Green", 123L, "FuShi");
        System.out.println(complexApple);

以下の結果が得られたComplexApple{name=‘FuShi’,weight=123,color=‘Green’}