java8 函接式口学习-Function

参考博客地址:https://blog.csdn.net/y_k_y/article/details/84632889

Function<T,R> :

抽象方法:

        R apply(T t):传入一个参数,返回想要的结果。

默认方法:

       为了下面能更好地解释,这里先假设有两个Function实例:f1,f2

       default <V> Function<V, R> compose(Function<? super V, ? extends T> before):f1.compose(f2).apply(arg),表示先执行f2,然后将得到的结果传给f1执行。

       default <V> Function<T,V> andThen(Function<? super R,? extends V> after):f1.andThen(f2).apply(arg),表示先执行f1,然后将得到的结果传给f2执行。

静态方法:

       static <T> Function<T, T> identity():获取到一个输入参数和返回结果一样的Function实例 

 上面的内容是来自上面链接的博客

Function提供了 compose,andThen两个方法。这几个方法的组合使用,使用顺序不同的得到的结果也不一样。

但是compose和andThen两个方法都是表示对输入的数据进行操作,只是先后顺序不一样。

有这样一个 需求,小明明妈妈让小明去买酱油,第一次给了10元,然后小明去了。

第二次妈妈也给了10元小明没有好处觉得吃亏了不去

然后妈妈总共给小明20其中的10元可以自己买吃的,

于是小明去的时候花5元买了并琪琳,然后花了10元买了酱油,回来时又花5元买了冰淇淋。

就是这样一个消费的先后的顺序

第一次消费 10-10=0

第二次消费20 -5-10-5=0

下面代码表示这样一个过程:

package com.soecode.lyf.demo.test.java8;

import org.junit.Test;

import java.util.function.Function;

/**
 * @author 魏文思
 * @date 2019/11/9$ 14:04$
 */
public class FunctionTest {

    @Test
    public void life() {
        //第一次,妈妈给小明10元去买酱油
        double tips = firstBuy(10.0, (m) -> 10.0 - getSoy().getCost());
        System.out.println("小明得到的小费:" + tips);

        //第二次,妈妈还是给小明10元买酱油,小明思考了一下,拒绝了
        System.out.println("小明将妈妈给的" + Function.identity().apply(10) + "元还了回去");

        //妈妈在了解完情况后,给了小明20元去买,小明当然很愉快去了
        double tips2 = secondBuy(20, (m) -> {
            System.out.println("买酱油前有" + m + "元");
            double v2 = m - getSoy().getCost();
            System.out.println("买完酱油后剩下" + v2 + "元");
            return v2;
        });
        System.out.println("小明剩下的小费:" + tips2);

    }

    public double firstBuy(double money, Function<Double, Double> buy) {
        return buy.apply(money);
    }

    public double secondBuy(double money, Function<Double, Double> buy) {
        //在去的路上小明先买了冰淇淋
        Function<Double, Double> beforeBuy = (m) -> {
            System.out.println("第一次买冰淇淋前有" + m + "元");
            double v1 = m - getIceCream().getCost();
            System.out.println("买完冰淇淋后剩下" + v1 + "元");
            return v1;
        };

        //回来的路上小明又买了冰淇淋
        Function<Double, Double> afterBuy = (m) -> {
            System.out.println("第二次买冰淇淋前有" + m + "元");
            double v3 = m - getIceCream().getCost();
            System.out.println("买完冰淇淋后剩下" + v3 + "元");
            return v3;
        };

        return buy.compose(beforeBuy).andThen(afterBuy).apply(money);
    }

    public Goods getSoy() {
        return new Goods("酱油", 10);
    }

    public Goods getIceCream() {
        return new Goods("冰淇淋", 5);
    }
}

执行结果如下:

一开始对这个compose andThen不是很理解,研究了一下,

这一行代码,数据源是钱,最开始的钱,apply(money)初始钱,然后去的路上花了5元,

buy.compose(beorebuy)    beforeBuy先于buy执行,拿beforeBuy的结果作为buy的源,最后再执行andThen(afterbuy),整个顺序如下:

还是上面的总结:

      f1.compose(f2).apply(arg),表示先执行f2,然后将得到的结果传给f1执行。

     f1.andThen(f2).apply(arg),表示先执行f1,然后将得到的结果传给f2执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值