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

Java使用Streams API按属性查找最接近的值

何松
2023-03-14

我来问一个我觉得以前没有人问过的问题,可能会得到一些有趣的答案:)

我目前正在研究一些Java代码,其目标是:

  • 接收收藏列表
public record ForecastPerDate(String date, Double value) {}

到目前为止,我的实现对我来说似乎相当高效和理智,但我不喜欢改变变量或状态(我最近变得更像Haskell开发人员,哈哈),并且一直很喜欢使用Java的Streams API。

仅供参考,该项目使用Java 17,因此很有帮助。我假设这可能可以通过一个reduce()函数和一些累加器来解决,但我不清楚如何解决,至少不会导致多次迭代。

代码如下:

 @Override
    public Long getAvailabilityFromForecastData(final String fuCode,
                                                final String articleCode,
                                                final Collection<ForecastPerDate> forecasts) {
        if (forecasts == null || forecasts.isEmpty()) {
            log.info(
                    "No forecasts received for FU {} articleCode {}, assuming 0!",
                    fuCode,
                    articleCode
            );
            return 0L;
        }

        final long todayEpochDay = LocalDate.now().toEpochDay();
        final Map<String, Double> forecastMap = new HashMap<>();
        long smallestDiff = Integer.MAX_VALUE;
        String smallestDiffDate = null;

        for (final ForecastPerDate forecast : forecasts) {
            final long forecastEpochDay = LocalDate.parse(forecast.date()).toEpochDay();
            final long diff = forecastEpochDay - todayEpochDay;

            if (diff >= 0 && diff < smallestDiff) {
                // we look for values in present or future (>=0)
                smallestDiff = diff;
                smallestDiffDate = forecast.date();
                forecastMap.put(forecast.date(), forecast.value());
            }
        }

        if (smallestDiffDate != null) {
            final Double wantedForecastValue = forecastMap.get(smallestDiffDate);
            if (wantedForecastValue != null) {
                return availabilityAmountFormatter(wantedForecastValue);
            }
        }

        log.info(
                "Resorting to fallback for FU {} articleCode {}, 0 availability for article!  Forecasts: {}",
                fuCode,
                articleCode,
                forecasts
        );
        return 0L;
    }

    private Long availabilityAmountFormatter(final Double raw) {
        return Math.round(Math.floor(raw));
    }

提前感谢!期待学习和建设性反馈!


共有2个答案

邢小云
2023-03-14

如果要保持与现有流程相似的流程,请尝试以下操作:

final LocalDate now = LocalDate.now();
return forecasts.stream()
        .map(ForecastPerDate::date)
        .map(LocalDate::parse)
        .filter(fd -> fd.isEqual(now) || fd.isAfter(now))
        .min()
        .map(LocalDate::toString)
        .map(forecastMap::get)
        .map(this::availabilityAmountFormatter)
        .orElseGet(() -> {
            log.info("Resorting to fallback...");
            return 0L;
        });
许焕
2023-03-14
匿名用户

您提到的大多数操作都是流上可用的方法调用。

  • 接收集合列表-

总的来说,它应该是这样的(我还没有编译它,所以第一次尝试时可能不起作用):

@Override
public Long getAvailabilityFromForecastData(final String fuCode,
                                            final String articleCode,
                                            final Collection<ForecastPerDate> forecasts) {

    var today = LocalDate.now();

    return forecasts.stream()
        .filter(forecast -> !today.isBefore(LocalDate.parse(forecast.date())))
        .min(Comparator.comparing(forecast -> 
             Duration.between(today, LocalDate.parse(forecast.date()))
        .map(forecast -> availabilityAmountFormatter(forecast.value()))
        .orElseGet(() -> {
            log.info("No forecasts found");
            return 0L;
        });
}

我会将一些逻辑移到ForecastPerDate中,以避免分析forecast。date()多次。

 类似资料:
  • 问题内容: 我正在寻找一种借助Elasticsearch查找最近价格/数量的可能性。问题是我没有范围。我要实现的是,结果按最近距离排序。根据示例搜索查询,我的索引包含3个具有以下价格(数字)的文档:45、27、32 给定数字与我的搜索值29的“距离”为45-29 = 16 | 27-29 = -2 | 32-29 = 3,所以我希望搜索结果是按“距离”评分的,该数字距离给定价格不远。 搜索查询示例

  • 问题内容: 我正在尝试查找具有Attribute的元素。好吧,我可以在Selenium中找到具有Id,tagName,Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一种方法,该方法将给定属性名称和值作为输入专门返回WebElement。 假设XPath不是一个选择,还有其他更好的方法吗? 问题答案: 您可以使用CSS轻松完成此任务。 公式为: 所以如果有的话 您可以使用以下方法找到它:

  • 我正在尝试查找具有属性的元素。我可以在Selenium中找到Id、tagName、Xpath和所有其他预定义方法的元素。但是,我正在尝试编写一个方法,专门返回WebElement,给定属性名和值作为输入。 假设XPath不是一个选项,还有其他更好的方法吗?

  • 问题内容: 是否有numpy-thonic方法(例如函数)在数组中查找最接近的值? 例: 问题答案:

  • 问题内容: 我试图找到没有jquery的具有特定标签名称的最接近的元素。当我单击a时,我想访问该表的。有什么建议吗?我读过有关偏移量的信息,但并不太了解。我应该只使用: 假设已经设置了单击元素 问题答案: 参加聚会的时间很少(非常),但是仍然如此。这应该做的伎俩:

  • 问题内容: 我正在编写一个小程序,为了提高效率,我需要能够找到数组中最接近的纬度和经度。 假设您有以下代码: 我得到的结果是: 它应该是(在此示例中,列表中的最后一个对象) 我知道如何获取单个值的最接近单元格,但我想让lambda函数考虑这两个值,但我不确定如何做到。救命? 问题答案: 为了正确计算地球上各点之间的距离,您需要使用Haversine公式。使用此答案中提供的Python实现,您可以像