java源码篇2:Function

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/likui19921224/article/details/89706561

Consumer接口和Function的最大不同在于Consumer接受参数类型并无返回结果;
Function接口/BiFunction接口是接受参数并生产一个结果;
执行方法R apply(T)
传入一个T参数 并返回我们的R参数;
举例:

	static   Function<Object, String>mFunctionA=x->{
		System.err.println(x+"");
		return   x+"";
	};
	public static void main(String[] args) {
	//	mConsumerA.andThen(mConsumerB).accept(10);;
	  mFunctionA.apply("1");
	}

compose方法:

  default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

先执行参数再调用自身的方法 并返回一个Function方法:

举例:


    static   Function<Object, String>mFunctionA=x->{
		System.err.println(x+"");
		return   x+"";
	};
	static   Function<String,Integer>mFunctionB=x->{
		  return  Integer.valueOf(x);
	};
	public static void main(String[] args) {
	      mFunctionA.compose(mFunctionB).apply("1");
	}

个人觉得 compse方法就是将两个方法的类型经行转化

class a extends boy
class c extends girl
我们输出结果是(a,R)
B(Boy, c)
A(gril,R)
A.compse(b);
调用过程就是
(a,R)->(girl,R).apply(Boy,c)
整理下: B的R 是A的T的子类/自身
B的T 是 输出的结果T的父类/自身

3.andThen 调用顺序和compse的是相反的:

 default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

先调用自身的 再调传入参数的apply
自身依然是<T,R> after 的 T 是自身R 的父类/自身被向上转型
自身的T 将是结果的T after的 R 也就是? extend是 V 将会被向上转型

4.identity 一致性 消费类型和生产类型一致

 static <T> Function<T, T> identity() {
        return t -> t;
    }

二.BiFunction
输入参数变为二种类型 得到一种结果 是Function的扩展版

猜你喜欢

转载自blog.csdn.net/likui19921224/article/details/89706561