【问题标题】:You can extend the IntSummaryStatistics class?您可以扩展 IntSummaryStatistics 类吗?
【发布时间】:2019-05-02 20:41:20
【问题描述】:

我正在使用Java流统计,使用速度,这样:

IntSummaryStatistics intSummary = join.stream(). MapToInt (t> t.get0(). GetCNationkey ()). SummaryStatistics();
Long sumResult = intSummary.getSum ();

我想要一个新类来构造一个新的getSum() 方法。比如:

IntSummaryStatisticsTest intSummarytest = join.stream (). MapToInt (t> t.get0 (). GetCNationkey ()). SummaryStatistics ();
Long sumResult = intSummarytest.getSumTest();

我尝试创建一个新类:

public class IntSummaryStatisticsTest extends IntSummaryStatistics {}

IntSummaryStatisticsTest summa = join.stream().mapToInt(t->t.get0().getCNationkey()).summaryStatistics();

但我收到此错误:incompatible types required java. Required: IntSummaryStatisticsTest Found: java.util.IntSummaryStatistics

是否可以实现这个新的getSumTest() 方法?

【问题讨论】:

  • 我更喜欢组合而不是继承,并接受 IntSummaryStatistics 对象作为构造函数中的参数,您可以通过以下方式对其进行初始化:var stats = new IntSummaryStatisticsTest(join.stream().mapToInt(t->t.get0().getCNationkey()).summaryStatistics());
  • 我该怎么做? @JacobG。
  • 如果一小时内没有其他人回答这个问题,我会写一个例子给你作为答案
  • 你能提供你的例子吗? @JacobG。
  • 当然,我看到这个问题得到了回答,认为你不再需要它了,但是给我一点,我会的:)

标签: java java-stream summary


【解决方案1】:

就像我在 cmets 中所说的那样,我会选择组合而不是继承。这意味着您可以创建您的类IntSummaryStatisticsTest,并接受IntSummaryStatistics 对象作为构造函数中的参数。您的课程如下所示:

class IntSummaryStatisticsTest {
    private final IntSummaryStatistics statistics;

    public IntSummaryStatisticsTest(IntSummaryStatistics statistics) {
        this.statistics = statistics;
    }

    public long getSumTest() {
        // return your value
    }
}

类的用法如下:

var summary = new IntSummaryStatisticsTest(join.stream()
        .mapToInt(t -> t.get0().getCNationkey())
        .summaryStatistics());

System.out.println(summary.getSumTest());

【讨论】:

  • 请注意:如果需要覆盖accept 方法,即必须更改/补充从原始IntSummaryStatistics 收集的数据时,此(最终)不起作用跨度>
【解决方案2】:

documentation of IntStream 给出提示:

...例如,您可以使用以下方法计算整数流的汇总统计信息:

IntSummaryStatistics stats = intStream.collect(
    IntSummaryStatistics::new,
    IntSummaryStatistics::accept,
    IntSummaryStatistics::combine);

你应该可以对IntSummaryStatisticsTest做同样的事情,即:

IntSummaryStatisticsTest stats = intStream.collect(
    IntSummaryStatisticsTest::new,
    IntSummaryStatisticsTest::accept,
    IntSummaryStatisticsTest::combine);

但也要考虑 Jacob 的评论/解决方案(使用组合可能会更好)

【讨论】:

  • ``` IntSummaryStatisticsTest stats = IntStream.collect( IntSummaryStatistics::new, IntSummaryStatistics::accept, IntSummaryStatistics::combine); ```这不起作用:(
  • 你应该使用IntSummaryStatisticsTest::new。他提供的代码是summaryStatistics() 方法的实际实现。您必须对其进行修改以满足您的需求。
  • 我只是在引用文档......我认为“......对IntSummaryStatisticsTest做同样的事情”很清楚 - 编辑
  • 我有这个错误:错误:(74, 56) java: non-static method collect(java.util.function.Supplier,java.util.function.ObjIntConsumer,java.util.function.BiConsumer) 不能从静态上下文中引用
  • IntSummaryStatisticsTest summa = join.stream().mapToInt(t -> t.get0().GetCNationkey()).collect(IntSummaryStatisticsTest::new, IntSummaryStatisticsTest::accept, IntSummaryStatisticsTest::combine);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2020-01-05
  • 2016-09-17
相关资源
最近更新 更多