gpt4 book ai didi

Java 8 Stream - 在下一行完成映射后是否可以使用对象?

转载 作者:行者123 更新时间:2023-11-30 06:33:29 25 4
gpt4 key购买 nike

我们开始将代码升级到团队中的新代码 Java 8。我被告知要重构如下所示的方法:

    for (Operation so : operations) {
OperationIndex operationIndex = Transformer.getOperationIndex(so);

if (operationIndex.getServiceOperationNumber() != null) {
invoice.getOperationNumbers().add(operationIndex);
Occasion occasion = so.getOccasion().get(0);

//here's some logic using occasion and invoice

invoice.setDate(occasion.getDate());
//some more methods using occasion...
}

我尝试了很多方法来使其发挥作用,但都失败了。毕竟我得出了这个解决方案:

    operations.stream()
.filter(so -> Transformer.getOperationIndex(so).getServiceOperationNumber() != null)
.forEach(so -> {
invoice.getOperationNumbers().add(Transformer.getOperationIndex(so));
Occasion occasion = so.getOccasion().get(0);

//here's some logic using occasion and invoice

invoice.setDate(occasion.getDate());
//some more methods using occasion...

});

但我仍然想知道在这种情况下这是否是最佳解决方案。这可以用更少的代码来完成吗?谢谢

最佳答案

我发现迁移到 Java 8 的人面临的主要问题之一是他们只了解语法,但不了解想法。我开玩笑地称其为 UPS 的人,他向驻伊拉克的美国士兵送圣诞礼物,并告诉邻居他一直在战区。从技术上讲,他是对的,但并不安静。

您只发布了一个片段,因此任何“优化”都会受到限制。也就是说,让我发表一些一般性评论,然后我将发布我的代码版本。

  1. 我并不反对多行 lambda。我还没有看到任何文献说 lambda 必须是单行语句,否则 hell 就会崩溃。

  2. 不清楚发票是在哪里创建的。如果它是在 if block 中创建的,那就很好。如果它是在上面的某个地方创建的,并且在不同的代码块中不断变化,那就没有那么多了。如果它作为参数发送到方法(邪恶的“out”参数),上帝会禁止这样做。您最好使用 Content Enricher模式,其中发票通过沿跳跃的变压器来丰富。

  3. 我倾向于避免将 forEach 与流一起使用,因为它表示 void 方法,这表示副作用,并且很难测试。根据我的经验,forEach 的大多数用法都可以用其他内容替换。

  4. 重构后的代码不一定比原始代码有所改进;如果您的客户希望您编写“现代”代码,无论这意味着什么,您应该考虑的不仅仅是更改语法。不要成为 UPS 的人!

    operations.stream()
    .map(so -> new SimpleImmutableEntry(so, Transformer.getOperationIndex(so)))
    .filter(t -> Objects.nonNull(so.getValue().getServiceOperationNumber()))
    .map(t -> {
    Invoice invoice = new Invoice();
    // here's some logic using occasion and invoice

    return invoice;
    })

关于Java 8 Stream - 在下一行完成映射后是否可以使用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45627974/

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