如何在java 8中将map转换为map的消费者?

42fyovps  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(162)

我有一个方法A,它接受(Consumer〈Map〈String,List〉〉)作为方法参数。

public void myMethodA(Consumer<Map<String,List<String>>> someMap) {

然而,调用方法A的方法B有一个散列表:

Map<String, String> myMap = Collections.singletonMap("a1", Arrays.asList("b"));

如何将变量myMap传递给方法A?

myMethodA((Consumer<Map<String,List<String>>>) myMap);

但我得到的是

java.lang.ClassCastException: java.util.Collections$SingletonMap incompatible with java.util.function.Consumer
yvgpqqbh

yvgpqqbh1#

消费者是function1.函数不是Map.函数是..函数--你唯一能做的就是调用函数.具体来说,消费者是一个函数,它接受类型为T的对象,并返回void(nothing).
因此,Consumer<Map<String,List<String>>> someMap是完全错误的,这就像叫你(Tiya)三明治,因为你可以吃三明治,你根本不是三明治,尽管你可以吃三明治。
ab之间的唯一区别在于:

public void a(Map<String, List<String>> map) { ... }

Consumer<Map<String, List<String>> b = map -> ....;

一个是方法,可以在需要调用方法的上下文中使用,另一个是变量,它们做的是同样的事情,实际上,我可以把a方法变成一个函数:

Consumer<Map<String, List<String>> b = this::a;

这很好用。
因此,没有办法做你想做的,出于同样的原因,它是绝对没有意义这样做:
乔:嘿,我做了个三明治。你能帮我找个会吃三明治的人吗?
蒂娅:当然可以!来,我做了这个三明治。
乔:什么......那是三明治。我想要一个能吃三明治的东西!
1.在java中,对象(比如,表达式有一个"引用类型")或原语(比如,表达式有一个"原语类型")。函数只是引用类型,其类型是所谓的函数接口:一个定义了一个方法的接口。在这一点上,"一个对象,它唯一的外部可调用的东西就是这个精确定义的函数"和"一个函数"变成了几乎相同的东西。当我说"一个消费者是一个函数"时,如果你感到困惑,那么这个脚注解释了这里的全部推理过程。

相关问题