【问题标题】:Group by Stream API for List API列表 API 按流 API 分组
【发布时间】:2020-10-27 21:07:24
【问题描述】:

我有一个代码块,它返回一个值列表,但我需要按特定值分组

List<String> fixedCat =
            allAuditedObservations.stream()
                .filter(e -> e.getZoneNumber().matches(fixedWithoutZoo))
                .map(e -> DateUtils.toLocalDateTimeFromUtcLocalDateTime(e.getObservedDtUtc()))
                .map(e -> e.toLocalDate())
                .distinct()
                .map(e -> Date.from(e.atStartOfDay(ZoneId.systemDefault()).toInstant()))
                .map(
                    e ->
                        String.valueOf(e.getTime())
                            .concat("--")
                            .concat(Observation.FIXED_CAMERA_CATEGORY))
                .collect(Collectors.toList());
        all.addAll(fixedCat);

返回 repose 为

[
    "1603692000000--FIXED",
    "1603778400000--FIXED"
] 

所以我更改了上面的代码以根据区域编号获取所有观察结果

 List<String> fixedCat =
            allAuditedObservations.stream()
                .filter(e -> e.getZoneNumber().matches(fixedWithoutZoo))
                .map(
                    observation -> {
                      observation.getZoneNumber();
                      LocalDateTime localDateTime =
                          DateUtils.toLocalDateTimeFromUtcLocalDateTime(
                              observation.getObservedDtUtc());
                      LocalDate date = localDateTime.toLocalDate();
                      Date dateTime =
                          Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());

                      return String.valueOf(dateTime.getTime())
                          .concat("--")
                          .concat(Observation.FIXED_CAMERA_CATEGORY)
                          .concat("--")
                          .concat(observation.getZoneNumber());
                    })
                .collect(Collectors.toList());

当我运行闲置代码时,我必须对每个单独的观察结果进行分组

[
    "1603692000000--FIXED--7010",
    "1603692000000--FIXED--7000",
    "1603692000000--FIXED--7020",
    "1603778400000--FIXED--7020",
    "1603778400000--FIXED--7010",
    "1603692000000--FIXED--7010",
    "1603692000000--FIXED--7010",
    "1603692000000--FIXED--7010"
] 

预期的反应

[
"1603692000000--FIXED--7010",
"1603778400000--FIXED--7020"

]

【问题讨论】:

  • 请把你的问题说清楚,具体问一下你遇到了什么问题。 返回 repose 为 - 对我们来说不是线索。
  • @GiorgiTsiklauri 已按区域编号对结果进行分组

标签: java lambda lightweight-stream-api


【解决方案1】:

Collectors.groupingBy 是您正在寻找的。我们按它们的第一个值分组,即日期。然后我们得到组的第一个元素。然后我们将它们收集为列表。你需要这样实现:

 List<String> fixedCat =
            allAuditedObservations.stream()
                .filter(e -> e.getZoneNumber().matches(fixedWithoutZoo))
                .map(
                    observation -> {
                      observation.getZoneNumber();
                      LocalDateTime localDateTime =
                          DateUtils.toLocalDateTimeFromUtcLocalDateTime(
                              observation.getObservedDtUtc());
                      LocalDate date = localDateTime.toLocalDate();
                      Date dateTime =
                          Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant());

                      return String.valueOf(dateTime.getTime())
                          .concat("--")
                          .concat(Observation.FIXED_CAMERA_CATEGORY)
                          .concat("--")
                          .concat(observation.getZoneNumber());
                    })
                .collect(Collectors.groupingBy(s -> s.split("--")[2])) // group them by their zone number
                .values()
                .stream()
                .map(strings -> strings.get(0))
                .collect(Collectors.toList());

我刚刚在我的本地机器上进行了测试,它似乎给出了您正在寻找的结果:

package com.company;
import java.util.Arrays;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String[] list = {
            "1603692000000--FIXED--7010",
            "1603692000000--FIXED--7000",
            "1603692000000--FIXED--7020",
            "1603778400000--FIXED--7020",
            "1603778400000--FIXED--7010",
            "1603692000000--FIXED--7010",
            "1603692000000--FIXED--7010",
            "1603692000000--FIXED--7010"
        };

        var result = Arrays.stream(list)
                .collect(Collectors.groupingBy(s -> s.split("--")[2])) // group them by their zone number
                .values()
                .stream()
                .map(strings -> strings.get(0))
                .collect(Collectors.toList());

        for (String s : result) {
            System.out.println(s);
        }
    }
}

// prints
// 1603778400000--FIXED--7020
// 1603692000000--FIXED--7010

【讨论】:

  • 它工作得很好,谢谢,但问题是它只返回 7020 和 7010 而不是 7000
  • 你的预期反应不是这样吗? ["1603692000000--FIXED--7010", "1603778400000--FIXED--7020"]
  • 好的,你想按他们的区域编号对他们进行分组,答案已更新为这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多