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

来源:2-8 和面试官聊聊实现管道和流计算的基石:函数式的Monad(2)

weixin_慕慕1188446

2021-03-19

老师您好,
问题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回答

求老仙

2021-03-19

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

1
2
求老仙
回复
weixin_慕慕1188446
对,apply可以是任意名字。只不过习惯上叫做apply。函数调用就是apply,apply function to data
2021-03-20
共2条回复

求老仙

2021-03-19

第3个问题:

理解是这样的

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

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

g = map(f)

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

0
2
求老仙
回复
weixin_慕慕1188446
是的.。理解正确,但是太细节了。
2021-03-20
共2条回复

求老仙

2021-03-19

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

0
0

笑傲Java面试 剖析大厂高频面试真题 秒变offer收割机

深度剖析大厂面试高频真题,让你秒变offer收割机

1783 学习 · 314 问题

查看课程