首页 > 解决方案 > 将流中的对收集到另一个对象中

问题描述

我有一个 Java 流 ->Stream.of(LocalDate1, LocalDate2, LocalDate3....)

我希望将其组合成一个对象流,每个对象需要 2 个连续日期,例如,我需要创建

Stream.of(Object1(LocalDate1, LocalDate2),
Object2(LocalDate2, LocalDate3))

等等。

任何人都可以帮忙吗?

谢谢!

我也可以接受 Reactor Mono/Flux 的想法。

标签: javaspring-bootjava-streamspring-webflux

解决方案


使用流,您可以执行以下操作;

@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());

推荐阅读