【问题标题】:Collect Pairs from Streams into another Object将流中的对收集到另一个对象中
【发布时间】:2021-09-03 03:46:01
【问题描述】:

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

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

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

等等。

任何人都可以帮忙吗?

谢谢!

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

【问题讨论】:

    标签: java spring-boot java-stream spring-webflux


    【解决方案1】:

    使用流,您可以按以下方式进行操作;

    @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}]
    

    你可以使用下面的flux,它会产生同样的结果;

    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 16+ 中,您可以用简单的 record 替换该嵌套类:record DoubleDateObject ( LocalDate d1 , LocalDate d2 ) {}。或者使用 ThreeTen-Extra 库中的 LocalDateRange 类。同样在 Java 16+ 中,您可以将 .collect(Collectors.toList()) 替换为 .toList()
    • 非常感谢您的回答!真的很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 2022-12-15
    • 2012-08-26
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多