从流中收集对到另一个对象
Collect Pairs from Streams into another Object
我有一个 Java 流 -> Stream.of(LocalDate1, LocalDate2, LocalDate3....)
我希望将其组合成一个对象流,每个对象都有 2 个连续的日期,
例如,我需要创建
Stream.of(Object1(LocalDate1, LocalDate2),
Object2(LocalDate2, LocalDate3))
等等。
有人可以帮忙吗?
谢谢!
我也同意采用 Reactor Mono/Flux 的想法。
使用流,您可以按如下方式进行;
@Test
void testStream() {
class DoubleDateObject {
LocalDate d1;
LocalDate d2;
public DoubleDateObject(LocalDate d1, LocalDate d2) {
this.d1 = d1;
this.d2 = d2;
}
@Override
public String toString() {
return "DoubleDateObject{" +
"d1=" + d1 +
", d2=" + d2 +
'}';
}
}
LocalDate[] dates = {LocalDate.now(), LocalDate.now(), LocalDate.now(), LocalDate.now()};
List<DoubleDateObject> ret = IntStream.range(0, dates.length)
.filter(i -> i % 2 == 1)
.mapToObj(i -> new DoubleDateObject(dates[i - 1], dates[i]))
.collect(Collectors.toList());
System.out.println(ret);
}
输出将是;
[DoubleDateObject{d1=2021-09-03, d2=2021-09-03}, DoubleDateObject{d1=2021-09-03, d2=2021-09-03}]
对于助焊剂,您可以使用以下内容,它会产生相同的结果;
List<DoubleDateObject> ret = Flux.range(0, dates.length)
.filter(i -> i % 2 == 1)
.map(i -> new DoubleDateObject(dates[i - 1], dates[i]))
.collectList().block();
如果您一开始没有数组,那么您可以执行以下操作,再次产生相同的输出; (将 Arrays.stream(dates) 替换为您的流)
final LocalDate[] tmp = {null};
List<DoubleDateObject> ret = Arrays.stream(dates)
.peek(date -> {
if (tmp[0] == null) tmp[0] = date;
else tmp[0] = null;
})
.filter(date -> tmp[0] == null)
.map(date -> new DoubleDateObject(tmp[0], date))
.collect(Collectors.toList());
我有一个 Java 流 -> Stream.of(LocalDate1, LocalDate2, LocalDate3....)
我希望将其组合成一个对象流,每个对象都有 2 个连续的日期, 例如,我需要创建
Stream.of(Object1(LocalDate1, LocalDate2),
Object2(LocalDate2, LocalDate3))
等等。
有人可以帮忙吗?
谢谢!
我也同意采用 Reactor Mono/Flux 的想法。
使用流,您可以按如下方式进行;
@Test
void testStream() {
class DoubleDateObject {
LocalDate d1;
LocalDate d2;
public DoubleDateObject(LocalDate d1, LocalDate d2) {
this.d1 = d1;
this.d2 = d2;
}
@Override
public String toString() {
return "DoubleDateObject{" +
"d1=" + d1 +
", d2=" + d2 +
'}';
}
}
LocalDate[] dates = {LocalDate.now(), LocalDate.now(), LocalDate.now(), LocalDate.now()};
List<DoubleDateObject> ret = IntStream.range(0, dates.length)
.filter(i -> i % 2 == 1)
.mapToObj(i -> new DoubleDateObject(dates[i - 1], dates[i]))
.collect(Collectors.toList());
System.out.println(ret);
}
输出将是;
[DoubleDateObject{d1=2021-09-03, d2=2021-09-03}, DoubleDateObject{d1=2021-09-03, d2=2021-09-03}]
对于助焊剂,您可以使用以下内容,它会产生相同的结果;
List<DoubleDateObject> ret = Flux.range(0, dates.length)
.filter(i -> i % 2 == 1)
.map(i -> new DoubleDateObject(dates[i - 1], dates[i]))
.collectList().block();
如果您一开始没有数组,那么您可以执行以下操作,再次产生相同的输出; (将 Arrays.stream(dates) 替换为您的流)
final LocalDate[] tmp = {null};
List<DoubleDateObject> ret = Arrays.stream(dates)
.peek(date -> {
if (tmp[0] == null) tmp[0] = date;
else tmp[0] = null;
})
.filter(date -> tmp[0] == null)
.map(date -> new DoubleDateObject(tmp[0], date))
.collect(Collectors.toList());