如何解决执行映射减少操作的通用方法Java-8
您所提出的示例与Java 8无关,与Java中泛型的工作原理无关。Function<T, Integer>function
并将在编译时Function<T, Double>function
进行类型擦除,并将其转换为Function
。方法重载的经验法则是具有不同的数量,类型或参数顺序。由于这两种方法都将转换为采用Function
参数,因此编译器会抱怨它。
话虽如此,srborlongan已经提供了一种解决该问题的方法。该解决方案的问题在于,您必须Test
针对每种类型(整数,双精度等)上的每种类型的操作(加法,减法等)不断修改类。另一种解决方案是使用method
overriding
而不是method overloading
:
Test
如下更改类:
public abstract class Test<I,O extends Number> {
List<I> list = new ArrayList<>();
public O performOperation(Function<I,O> function) {
return list.stream().map(function).reduce((a,b)->operation(a,b)).get();
}
public void add(I i) {
list.add(i);
}
public abstract O operation(O a,O b);
}
创建一个子类Test
将添加两个Integer
。
public class MapStringToIntAddtionOperation extends Test<String,Integer> {
@Override
public Integer operation(Integer a,Integer b) {
return a+b;
}
}
然后,客户代码可以使用上述代码,如下所示:
public static void main(String []args) {
Test<String,Integer> test = new MapStringToIntAddtionOperation();
test.add("1");
test.add("2");
System.out.println(test.performOperation(Integer::parseInt));
}
使用这种方法的优点是您的Test
班级符合该open-
closed
原则。要添加新的运算(如乘法),您要做的就是添加的新子类Test
和将两个数字相乘override
的operation
方法。将其与Decorator模式结合使用,您甚至可以最小化必须创建的子类的数量。
此答案中的示例仅供参考。有很多改进的领域(例如使Test
功能接口代替抽象类)超出了问题的范围。
解决方法
如何在Java 8中使用泛型参数重载Function?
public class Test<T> {
List<T> list = new ArrayList<>();
public int sum(Function<T,Integer> function) {
return list.stream().map(function).reduce(Integer::sum).get();
}
public double sum(Function<T,Double> function) {
return list.stream().map(function).reduce(Double::sum).get();
}
}
错误:java:名称冲突:sum(java.util.function.Function
)和sum(java.util.function.Function
)具有相同的擦除
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。