当前位置: 首页 > 面试题库 >

执行映射减少操作的通用方法。(Java-8)

海鸣
2023-03-14
问题内容

如何在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
)具有相同的擦除


问题答案:

您所提出的示例与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和将两个数字相乘overrideoperation方法。将其与Decorator模式结合使用,您甚至可以最小化必须创建的子类的数量。

注意 此答案中的示例仅供参考。有很多改进的领域(例如使Test功能接口代替抽象类)超出了问题的范围。



 类似资料:
  • 我有一个java。util。流动包含键值对的流,如: 现在,我想合并所有具有相同密钥的条目: 数据已经排序,因此只需合并连续的数据集。 现在,我正在寻找一种方法来转换上述流的内容,而不将所有数据集加载到内存中。 我更喜欢得到一个java.util.stream.Stream,结果是一个不同的对象类型包含一个值列表,而不是一个单独的值。 我唯一的方法是一个自定义迭代器,它执行合并,但是转换为迭代器并

  • 我有以下形式的地图: 让INNER成为内部地图,即。 例如,我想在一个新的中减少START映射 它们具有相同的键,但值不同。特别是,对于每个键,我希望新的Double值是相应键的INNER映射中值的SUM。 如何使用JAVA 8的流API来实现这一点? 谢谢大家。 编辑:样例地图为 我想要一张像下面这样的新地图:

  • 我只是想学习PySpark,但对以下两个RDD之间的区别感到困惑,我知道一个是类型集,一个是列表,但两者都是RDD 和 图和减函数处理代码: 我可以很容易地执行映射/减少功能对第二个rdd数据,但当我尝试执行映射或减少我得到以下错误:那么我们如何将第一个rdd转换为第二个rdd数据,或者如果有任何方法来解决以下错误请帮助 Py4JJavaError:调用z:org时出错。阿帕奇。火花应用程序编程接

  • 我在单个节点上使用hadoop 1.0.1,并尝试使用python 2.7流式传输制表符分隔的文件。我可以让Michael Noll的字数计数脚本使用hadoop/python运行,但无法让这个极其简单的映射器和减速器工作,只是复制文件。这是映射器: 这是减速器: 以下是输入文件的一部分: mapper和reducer在linux中运行良好: 但在我修改映射器和reducer之后,将输入文件移动到

  • 我可以成功地运行SELECT*FROM records这样的语句,这不会创建一个map/reduce任务。 但是当我尝试运行SELECT*FROM records where year='1949'时,映射/减少任务总是会出现一些错误 hadoop give me诊断: 应用程序application_1382680612829_0136失败1次,原因是appattempt_13826806128

  • 问题内容: 我目前正在开发一个涉及在Rails服务器上同步联系人的应用程序。我正在使用Redis服务器和sidekiq在后台执行联系人同步。我的数据库是mongodb,我正在使用Mongoid gem作为ORM。工作流程如下: 电话上的联系人通过应用程序传递到Rails服务器,然后在Rails服务器上,它在Redis服务器中排队。 现在,cron作业会触发连接到Redis的sidekiq并完成作业