gpt4 book ai didi

Java 8 API 流。需要解决重复 key 问题

转载 作者:行者123 更新时间:2023-12-02 02:35:28 24 4
gpt4 key购买 nike

我有一个如下所示的日志文件:

LSR2019-07-12_12:07:21.554
KMH2019-07-12_12:09:44.291
RGH2019-07-12_12:29:28.352
RGH2019-07-12_12:33:08.603

我有一个解析器,可以将数据解析为缩写/日期/时间:

public Map <String, ?> parse() throws IOException {

try (Stream<String>lines = Files.lines(path)){


return lines.collect(Collectors.toMap(
string -> string.substring(0,3),
string -> new DateAndTimeInfo(LocalTime.from(DateTimeFormatter.ofPattern("HH:mm:ss.SSS").parse((string.substring(3).split("_")[1]))),
LocalDate.parse(string.substring(3).split("_")[0], DateTimeFormatter.ofPattern("yyyy-MM-dd"))),
(string1, string2)-> ??? )); //Struggle here

解析后,它会创建一个映射,其中包含缩写作为键和 DateAndTimeInfo 类的实例。该类如下所示:

public class DateAndTimeInfo {
private List<LocalTime> localTime;
private List<LocalDate> localDate;

public DateAndTimeInfo(LocalTime localTime, LocalDate localDate) {
this.localTime = Arrays.asList(localTime);
this.localDate = Arrays.asList(localDate);
}
public List<LocalTime> getLocalTime() {
return this.localTime;
}
public List<LocalDate> getLocalDate() {
return this.localDate;
}
public void addAnotherLapTime(LocalTime localtime, LocalDate localDate) {
this.localTime.add(localtime);
this.localDate.add(localDate);
}
}

一切正常,直到日志文件出现重复的缩写。一旦出现重复键,我希望将数据存储在 DateAndTimeInfo 对象内,该对象是在解析第一个重复项时创建的。为此,我有 addAnotherLapTime() 方法。问题是我不知道如何将其写入我的流中。

最佳答案

由于值的组合最终会出现在 List 对象中,因此这是 groupingBy 收集器的任务。

但首先,您必须修复 DateAndTimeInfo 类。它只是构造函数

public DateAndTimeInfo(LocalTime localTime, LocalDate localDate) {
this.localTime = Arrays.asList(localTime);
this.localDate = Arrays.asList(localDate);
}

创建固定大小列表,因此该方法

    public void addAnotherLapTime(LocalTime localtime, LocalDate localDate) {
this.localTime.add(localtime);
this.localDate.add(localDate);
}

会因异常而失败。

当您使用时

public class DateAndTimeInfo {
private List<LocalTime> localTime;
private List<LocalDate> localDate;

public DateAndTimeInfo() {
localTime = new ArrayList<>();
localDate = new ArrayList<>();
}
public List<LocalTime> getLocalTime() {
return this.localTime;
}
public List<LocalDate> getLocalDate() {
return this.localDate;
}
public void addAnotherLapTime(LocalTime localtime, LocalDate localDate) {
this.localTime.add(localtime);
this.localDate.add(localDate);
}
}

相反,您可以像这样收集 map

public Map<String, DateAndTimeInfo> parse() throws IOException {
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss.SSS");
try(Stream<String>lines = Files.lines(path)){
return lines.collect(Collectors.groupingBy(
string -> string.substring(0,3),
Collector.of(DateAndTimeInfo::new, (info,str) -> {
LocalDateTime ldt = LocalDateTime.parse(str.substring(3), f);
info.addAnotherLapTime(ldt.toLocalTime(), ldt.toLocalDate());
}, (info1,info2) -> {
info1.getLocalDate().addAll(info2.getLocalDate());
info1.getLocalTime().addAll(info2.getLocalTime());
return info1;
})));
}
}

groupingBy 允许为组指定收集器,此解决方案为 DateAndTimeInfo 对象创建一个新的临时 Collector

您可以考虑是否确实要将日期和时间保留在不同的列表中。

替代方案是:

public class DateAndTimeInfo {
private List<LocalDateTime> localDateTimes;

public DateAndTimeInfo(List<LocalDateTime> list) {
localDateTimes = list;
}
public List<LocalDateTime> getLocalDateTimes() {
return localDateTimes;
}
// in case this is really needed
public List<LocalTime> getLocalTime() {
return localDateTimes.stream()
.map(LocalDateTime::toLocalTime)
.collect(Collectors.toList());
}
public List<LocalDate> getLocalDate() {
return localDateTimes.stream()
.map(LocalDateTime::toLocalDate)
.collect(Collectors.toList());
}
}

然后

public Map<String, DateAndTimeInfo> parse() throws IOException {
DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH:mm:ss.SSS");
try(Stream<String>lines = Files.lines(path)){
return lines.collect(Collectors.groupingBy(
string -> string.substring(0,3),
Collectors.collectingAndThen(
Collectors.mapping(s -> LocalDateTime.parse(s.substring(3), f),
Collectors.toList()),
DateAndTimeInfo::new)));
}
}

关于Java 8 API 流。需要解决重复 key 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64390508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com