当前位置: 首页 > 知识库问答 >
问题:

Java 11基于枚举值选择要应用于流的方法

弘靖琪
2023-03-14

我有以下枚举。

public enum AggregationType
{
    MIN,
    MAX,
    AVERAGE
}

假设我有一个传递枚举值的函数,比如

public Float someFunction(final AggregationType enum) {
            return (float) provides.stream()
                                      .mapToDouble(this::someFunc)
                                      .average()
                                      .orElse(-1);
        

}

我想应用这个。平均值()。min()。基于枚举值的流上的max()方法。

我怎样才能做到这一点?我不想在某个函数中使用简单的开关函数,而是在这个返回语句中。

所以我想要一些

public Float someFunction(final AggregationType enum) {
            return (float) provides.stream()
                                      .mapToDouble(this::someFunc)
                                      .decideWhichMethodShouldBeUsed()
                                      .orElse(-1);


}

其中decidewhichmethodshouldbeeused()根据枚举决定使用哪个函数。

共有1个答案

方航
2023-03-14

当您可以将enum类型更改为

public enum AggregationType {
    MIN(DoubleStream::min),
    MAX(DoubleStream::max),
    AVERAGE(DoubleStream::average);

    public final Function<DoubleStream, OptionalDouble> operation;

    AggregationType(Function<DoubleStream, OptionalDouble> f) {
        operation = f;
    }
}

您可以实现如下方法

public Float someFunction(final AggregationType aType) {
    return (float)aType.operation.apply(provides.stream().mapToDouble(this::someFunc))
        .orElse(-1);
}

如果更改枚举类型不是一个选项,则必须在要实现someFunction的位置处理到实际操作的映射,例如。

private static final Map<AggregationType,Function<DoubleStream, OptionalDouble>> OPS;
static {
    EnumMap<AggregationType,Function<DoubleStream, OptionalDouble>>
        m = new EnumMap<>(AggregationType.class);
    m.put(AggregationType.MIN, DoubleStream::min);
    m.put(AggregationType.MAX, DoubleStream::max);
    m.put(AggregationType.AVERAGE, DoubleStream::average);
    OPS = Collections.unmodifiableMap(m);
}

public Float someFunction(final AggregationType aType) {
    return (float)OPS.get(aType).apply(provides.stream().mapToDouble(this::someFunc))
        .orElse(-1);
}
 类似资料:
  • 问题内容: 我需要选择列的枚举值。通过搜索,我发现了两种方法: 和另一个: 尽管第一个查询将为我提供此信息: 第二个查询给了我相同的内容,并且还有其他列。我宁愿只获取那些没有“ enum()”和逗号的值,是否可能,还是我需要解析这些值?并不是仅检查是否有更简单的方法就很困难。 假设没有更简单的方法,那么上面两个查询中的哪个更适合使用?我注意到第二个查询在运行时没有显示查询时间,我几乎认为它根本不需

  • 我正在尝试从以下枚举中筛选,以根据随机机会选择其中一个值。 目前,我正在使用此代码选择一个值。 还有我的随机效用函数 目前,大多数情况下,它将准确地选择一个没有问题的层值。然而,大约在的时候,我会得到一个索引arrayoutofbounds。 我知道这是因为枚举中的机会分散到很远的地方(因为如果我向枚举添加更多值,机会不会像它们那样分散,那么就不会发生此异常)。 如何修复此错误?或者有更好的方法

  • 我正在使用Spring 4.0.1,希望使用enum实现一个singleton。我的单例对象需要我在属性文件中定义的服务器名。如何将这个值注入到singleton对象中? 每个服务器名称将有一个单例对象。 请帮忙

  • 我有以下结构 包含枚举,该枚举包含或。现在我有了一个类,它包含一个。 这是在swagger yml中指定的(删除了一些不相关的代码) 我使用(也尝试了v3&openapi-generator)生成代码,配置如下: 现在发生的情况是,库将生成注释: 这里的问题是,如果我现在尝试反序列化/序列化包含带有的收件箱的Json字符串,它将引发异常,因为没有名称为的已知子类型。 seralizer期望注释指定

  • 在下面的代码中:我正在读取一个文件,获取标题行,查找特定的标题列并存储它们的索引。然后我遍历其余的行,只需要这些索引的值。

  • 我需要根据该值被选择的百分比概率选择一个值。例如: 时间增量值a的10% 时间增量值b的20% 时间增量值c的30% 时间增量值d的40% 百分比加起来总是正好100% 我遇到过几种像这样的解决方案,但我确定它们不可能是正确的。以下是使用上述解决方案构建的示例程序: 输出: 预期输出: 我相信我需要使用某种算法将百分比转换为从0到99的刻度,以便随机数生成器可以准确地选择一个值。不过,我想不出如何