请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

3分32秒处,定义的map方法接收了FN函数式接口入参问题

老师您好,
问题1: map方法中调用了f.apply(this.data),这里的this是指的是event -> event.map(Transforms::transform) 中的event吗?

我把map函数入参改写了一下

        s.map(event -> {
	        // 这里的event是Event
            System.out.println(event);
            // 问题3:这里的e如何自动识别为Event.data的呢
            return event.map(e -> {
	            // 这里的e打印出来的是int类型,也就是Event.data?咋转的呢
                System.out.println(e);
                return Transforms.transform(200);
            });
        })

问题2: 我理解的调用链是 f.apply(this.data) -》Transforms.transform(this.data),那么我代码中的Transforms.transform(e)也传入了一个参数e,但是事实上我的e=200入参成功了,那么f.apply(this.data)的执行流程是什么样的呢?

提出以上3个问题,这段逻辑如何正确理解呢?

我又改写了代码,在Event中加入了data2变量,为啥调用event.map(e -> {System.out.println(e) 推导出来的e是data,而不是data2呢?

public class Event<T>{
	// 新增
    T data2;
    T data;
    public Event(T data){
        this.data = data;
    }
    // 新增
    public void setData2(T data2) {
        this.data2 = data2;
    }
    .......
	        s.map(event -> {
            event.setData2(2000);
            return event.map(e -> {
                // 这里的e是Event.data, 为啥不是data2呢
                System.out.println(e);
                return Transforms.transform(e);
            });})
            .forEach(e ->
                    System.out.println(e.data)
            );

正在回答 回答被采纳积分+3

3回答

求老仙 2021-03-19 23:03:42

先回答你的第2个问题,map的不是data2是因为`map`函数将f,也就是e->{...}, 应用(apply)到了data上面。

1 回复 有任何疑惑可以回复我~
  • 提问者 weixin_慕慕1188446 #1
    试过了,apply中的this.data2只是对e的推断,apply方法本身并不会被调用,f.apply方法是应用在event实例的map方法作用域,所以可以用this,这里的apply方法名可以是任意方法名,但是参数类型不是必须指定不一定是泛型,也可以是void,主要用来推导流式计算时的参数
    
    个人理解,请老仙指正
    回复 有任何疑惑可以回复我~ 2021-03-20 11:13:29
  • 求老仙 回复 提问者 weixin_慕慕1188446 #2
    对,apply可以是任意名字。只不过习惯上叫做apply。函数调用就是apply,apply function to data
    回复 有任何疑惑可以回复我~ 2021-03-20 18:30:57
求老仙 2021-03-19 23:10:34

第3个问题:

理解是这样的

f = event -> event.map(Transforms::transform)

map是一个高阶函数, 你可以这样理解

g = map(f)

这样得到一个新的函数g,这个函数可以把s中的数据应用函数f,得到新的数据。

0 回复 有任何疑惑可以回复我~
  • 提问者 weixin_慕慕1188446 #1
    相当于Event通过map拓展了一个函数 Transfer.transfer(Integer id), 通只不过要该函数的作用于范围在map中,通过apply的形式推导了transfer的入参,也就是所谓的mapping映射其实是参数映射,因为有了map(f)函数,所以Event也就成了Monad
    回复 有任何疑惑可以回复我~ 2021-03-20 10:53:49
  • 求老仙 回复 提问者 weixin_慕慕1188446 #2
    是的.。理解正确,但是太细节了。
    回复 有任何疑惑可以回复我~ 2021-03-20 18:25:06
求老仙 2021-03-19 23:05:01

你的1个问题:s.map中map的this,一定是s。 

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信