gpt4 book ai didi

java - "Bad Form"是用Java Stream发送邮件的map函数吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:59:39 26 4
gpt4 key购买 nike

我正在尝试使用 Java Streams 使客户列表的顺序处理并行运行。这是我们在重新构建整个系统时正在解决的问题的短期创可贴。

我开始的是 List<Customer> Customers包含客户联系信息和所有相关交易数据的结构。从概念上讲,我要替换的代码如下所示:

long emailsSent = 0;
List<Customer> customers = methodLoadingAllrelevantData();
for (Customer customer: customers) {
boolean isEmailSent = sendEmail(customer);
if (isEmailSent) {
emailsSent++;
}
}

sendMail(customer)功能:

  1. 确定是否应发送电子邮件
  2. 格式化电子邮件
  3. 尝试发送电子邮件
  4. 如果邮件发送成功则返回true

不是很好的代码,但我只是想从现有代码中获得更快的速度,而不是让它变得更好。该方法及其所有调用都是 100% 线程安全的。

我把它放在下面的流结构中:

ForkJoinPool limitedParallelThreadPool = new ForkJoinPool(numberOfThreads);
emailsSent = limitedParallelThreadPool.submit( () ->
customers.stream().parallel()
.map(this::_emailCustomer)
.filter(b -> b == true).count()
).get();

这确实按预期工作,返回与顺序版本相同的数据。

我的问题是:因为我的方法的目的是生成一封电子邮件,所以我使用 map 是不是不好的做法?功能?有更好的答案吗?实际上,我是将客户映射到 boolean 值,但此映射的一部分需要触发电子邮件的流程。

我最初尝试使用 forEach()运算符,但我不知道如何在不向 sendMail 添加状态信息的情况下获取计数函数,这会干扰它的线程安全性。

最佳答案

Returns true if the email was sent successfully

利用 _emailCustomer 方法返回 boolean 这一事实并不是最糟糕的主意,因此您可以使用 Stream#filter 而不是 Stream#mapStream#filter 的组合:

customers.parallelStream()
.filter(this::_emailCustomer)
.count()

不过,要回答您的问题,Stream#map 是否是要使用的正确中间操作取决于用例。根据documentationStream#map 中,方法接受的 Function 参数必须是:

a non-interfering, stateless function to apply to each element

如果您的 _emailCustomer 方法是干扰性的或有状态的,那么我会避免在 Stream#map 中调用它,尤其是在并行上下文中。

关于java - "Bad Form"是用Java Stream发送邮件的map函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53233233/

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