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上面。
122021-03-20 -
求老仙
2021-03-19
第3个问题:
理解是这样的
f = event -> event.map(Transforms::transform)
map是一个高阶函数, 你可以这样理解
g = map(f)
这样得到一个新的函数g,这个函数可以把s中的数据应用函数f,得到新的数据。
022021-03-20 -
求老仙
2021-03-19
你的1个问题:s.map中map的this,一定是s。
00
相似问题