gpt4 book ai didi

用于条件归约操作的 Java8 Lambda

转载 作者:行者123 更新时间:2023-12-04 03:07:43 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Java 8 Stream mixing two elements

(6 个回答)


3年前关闭。




我有一个 TimeSlots 集合,我想通过合并连接的 TimeSlots 将它转换为另一个 TimeSlots 集合。
这是代码的工作副本 -

    private List<TimeSlot> getMergedConnectedSlots(final List<TimeSlot> orderedSlot) {
List<TimeSlot> mergedOrdered = new ArrayList<>();
mergedOrdered.add(orderedSlot.get(0));
for (int i = 0; i < orderedSlot.size() - 1; i ++ ) {
TimeSlot ts1 = mergedOrdered.get(mergedOrdered.size() - 1);
TimeSlot ts2 = orderedSlot.get(i + 1);
Range<Long> ts1Range = Range.closed(ts1.getStartTime(), ts1.getEndTime());
Range<Long> ts2Range = Range.closed(ts2.getStartTime(), ts2.getEndTime());
if(ts1Range.isConnected(ts2Range)) {
val mergedRange = ts1Range.span(ts2Range);
mergedOrdered.remove(mergedOrdered.size() - 1);
mergedOrdered.add(new TimeSlot(mergedRange.lowerEndpoint(), mergedRange.upperEndpoint()));
} else {
mergedOrdered.add(ts2);
}
}
return ImmutableList.copyOf(mergedOrdered);
}

很明显,上面的代码很冗长,而且有很多行。我想知道是否有一种简洁的 lamda/function 方法可以改进此代码?
我尝试使用 reduce 操作,但这对我不起作用,因为它最终将其减少到单个 TimeSlot。

最佳答案

我认为您可以使您的代码更加优化,而不使用其他对象进行合并。例如。使用 POJO。我没有在很多情况下测试这段代码,但这是我的方法:

public class Foo {
private static final Comparator<TimeSlot> TIME_SLOT_COMPARATOR = (slot1, slot2) -> {
int res = Long.compare(slot1.startTime, slot2.startTime);
return res != 0 ? res : Long.compare(slot1.endTime, slot2.endTime);
};

public static void main(String... args) {
Set<TimeSlot> slots = new TreeSet<>(TIME_SLOT_COMPARATOR);

slots.add(new TimeSlot(1, 3));
slots.add(new TimeSlot(2, 6));
slots.add(new TimeSlot(4, 5));
slots.add(new TimeSlot(7, 8));

Set<TimeSlot> res = getMergedConnectedSlots(slots);
// res[0]: [1:6]
// res[1]: [7:8]
}

@AllArgsConstructor
static class TimeSlot {
private long startTime;
private long endTime;
}

private static Set<TimeSlot> getMergedConnectedSlots(TreeSet<TimeSlot> slots) {
Set<TimeSlot> res = new TreeSet<>(TIME_SLOT_COMPARATOR);

long startTime = -1;
long endTime = -1;

for (TimeSlot slot : slots) {
if (startTime == -1) {
startTime = slot.startTime;
endTime = slot.endTime;
} else if (slot.startTime > endTime) {
res.add(new TimeSlot(startTime, endTime));
startTime = slot.startTime;
endTime = slot.endTime;
} else
endTime = Math.max(endTime, slot.endTime);
}

if (startTime != -1)
res.add(new TimeSlot(startTime, endTime));

return res;
}
}

关于用于条件归约操作的 Java8 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47588491/

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