转换Java 7的IntStream过滤器功能

时间:2019-04-13 00:56:07

标签: java

背景:我的应用程序不允许我引入外部库,尽管有些可以访问。我正在使用Java 7。 免责声明:这是我的第一个Stack问题。

我的特定项目是尝试从本地日期中提取两个时间戳,其中第一个日期是记录创建日期,第二个日期是响应日期,然后确定这些日期是否在我的工作日内。稍后我会发现差异。

我已经超出了我的深度,所以我需要帮助将Java 8代码“转换”为Java 7。

我已经搜索了一些松散相关的答案,但是我在努力理解这些概念固有的基础。

主要代码

        int allDaysBetween = (int) (ChronoUnit.DAYS.between(fromDay, toDay) + 1);
        long allWorkingMinutes = IntStream.range(0, allDaysBetween)
                .filter(i -> isWorkingDay(from.plusDays(i)))
                .count() * WORKING_MINUTES_PER_DAY ;

支持代码

    private boolean isWorkingDay(final LocalDateTime time) {
        return time.getDayOfWeek().getValue() < DayOfWeek.SATURDAY.getValue();
    }

我只是需要功能上等效的东西。据我了解,plusDays会将关闭办公室的时间添加到我的创建日期中,因此,当我从响应日期获得差异时,我将得到一个值较小的整数。

实际应用是这样的

  • 办公室于2019-04-05 19:00:00关闭

  • 记录创建于2019-04-06 09:35:00

  • 办公室将于2019-04-08 06:00:00

  • 响应创建于2019-04-08 07:32:00

我不想包括周末时间,而是要排除它,所以当我找到差异时,最终得出的是基于工作时间的“正确”分钟数。

2 个答案:

答案 0 :(得分:4)

以下Java 8+流代码:

long allWorkingMinutes = IntStream.range(0, allDaysBetween)
        .filter(i -> isWorkingDay(from.plusDays(i)))
        .count() * WORKING_MINUTES_PER_DAY ;

与在任何Java版本中均可使用的通用代码相同:

long count = 0;
for (int i = 0; i < allDaysBetween; i++)
    if (isWorkingDay(from.plusDays(i)))
        count++;
long allWorkingMinutes = count * WORKING_MINUTES_PER_DAY ;

对于ChronoUnitLocalDateTimeDayOfWeek类,请使用ThreeTen Backport获得Java SE 6和7支持。

答案 1 :(得分:0)

ThreeTen Backport

即使您说您不能使用外部库(为什么?),我还是建议您使用一个库,即使这样做只是为了其他读者的利益。 java.time已被反向移植。因此,您可以在Java 7上使用相同的日期/时间类型。只有流操作不可用(可能不存在类似功能的库,我不知道)。所以我改用经典循环。

    LocalDateTime fromDay = LocalDateTime.of(2019, Month.APRIL, 12, 0, 0);
    LocalDateTime toDay = LocalDateTime.of(2019, Month.APRIL, 16, 0, 0);
    int allDaysBetween = 0;
    for (LocalDate d = fromDay.toLocalDate(); ! d.isAfter(toDay.toLocalDate()); d = d.plusDays(1)) {
        if (isWorkingDay(d)) {
            allDaysBetween++;
        }
    }
    long allWorkingMinutes = allDaysBetween * WORKING_MINUTES_PER_DAY;
    System.out.println(allWorkingMinutes);

我已将threetenbp-1.3.6.jarthreetenbp-1.3.6-javadoc.jar添加到我的项目中(我相信存在较新的版本),并且正在使用以下导入:

import org.threeten.bp.DayOfWeek;
import org.threeten.bp.Duration;
import org.threeten.bp.LocalDate;
import org.threeten.bp.LocalDateTime;
import org.threeten.bp.Month;
import org.threeten.bp.temporal.ChronoUnit;

我将您的支持方法isWorkingDay更改为一个LocalDate参数,因为我发现它很方便,它也适用于您的版本。

您可能要挑战该决定?如果这是一个不使用外部库的项目决定,则可能要挑战。您可能会说ThreeTen Backport不是真正的外部,因为它是Java核心功能的反向移植。并且只有在转移到Java 8或更高版本的一天之前,您才需要该库。

链接