假设我有一个带有以下签名的方法:
<T, U extends Comparable<? super U>> Comparator<T> method(Map<String, Function<? super T, ? extends U>> comparatorFunctionMap)
Run Code Online (Sandbox Code Playgroud)
该方法接受函数映射(使用字符串键)并创建Comparator<T>一个结果(如何重要).映射值是实例Function<? super T, ? extends U>,因此可以直接传递给它们Comparator.comparing().
如何以类型安全的方式填充此地图?说我有一类Person具有属性name和age(他们和getter).
当我执行以下操作时:
Map<String, Function<? super Person, ? extends Comparable>> map1 = new HashMap<>();
map1.put("name", Person::getName);
method(map1);
Run Code Online (Sandbox Code Playgroud)
我在第1行和第3行收到警告.如果我尝试这样做,例如:
Map<String, Function<? super Person, ? extends Comparable<?>>> map2 = new HashMap<>();
map2.put("name", Person::getName);
method(map2);
Run Code Online (Sandbox Code Playgroud)
第三行是编译错误.
有没有办法安全地做这种类型?
假设我有一系列项目,我想通过myReducer函数(无论它是什么)执行归约操作。如果我的项目在一个数组中(比如myArray),这很容易:
myArray.reduce(myReducer);
Run Code Online (Sandbox Code Playgroud)
但是,如果我的序列非常大并且我不想分配所有它的数组,只是为了立即逐项减少它怎么办?我可以为我的序列创建一个生成器函数,这部分很清楚。有没有一种直接的方法来执行减少?我的意思是除了自己为生成器编写 reduce 功能之外。