java - 如何将两个 forEach() 循环替换为 Java Stream?

标签 java

如果我可以将下面代码中的两个 forEach() 循环替换为 Java Stream,有什么建议吗?

注意:对我来说,挑战是如果 firstConjCpnHistMap 中存在任何具有相似键的项目,那么我不想替换它,即我想跳过该迭代...这意味着这个问题有 2 个问题:

  1. 如何避免两个 forEach() 循环
  2. 有没有办法在将键/值放入Map中时,如果存在相似的键,则不要替换它,这与HashMap<的行为相反 即每当发生 put 操作时进行替换。
public List<TicketingDocumentServiceCouponHistory> build(GetTicketingDocumentRS rs) {
    LOGGER.debug("Building FirstConjCpnHistList for TKTRES - 137");

    Map<BigInteger, TicketingDocumentServiceCouponHistory> firstConjCpnHistMap = new HashMap<>();

    rs.getDetails()
        .get(0)
        .getTicket()
        .getHistory()
        .forEach(history -> history.getServiceCouponHistory()
            .forEach(couponHistory -> {
                if (couponHistory.getCoupon().intValue() % 4 == 1 &&
                    !couponHistory.getCoupon().equals(BigInteger.ONE) &&
                    !firstConjCpnHistMap.containsKey(couponHistory.getCoupon())) {
                    firstConjCpnHistMap.put(couponHistory.getCoupon(), couponHistory);
                }
            }));

    return new ArrayList<>(firstConjCpnHistMap.values());
}

最佳答案

  1. 使用Stream.flatMap()
  2. 使用Map.putIfAbsent()
 rs.getDetails()
    .get(0)
    .getTicket()
    .getHistory()
    .flatMap(history->history.getServiceCouponHistory().stream())
    .forEach(couponHistory -> {
        if (couponHistory.getCoupon().intValue() % 4 == 1 &&
            !couponHistory.getCoupon().equals(BigInteger.ONE)) {
            firstConjCpnHistMap.putIfAbsent(couponHistory.getCoupon(), couponHistory);
        }
        });

关于java - 如何将两个 forEach() 循环替换为 Java Stream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56969019/

相关文章:

java - SecureRandom 返回错误的一般声明 - Java

java - 这两个命令行执行.jar的区别?

java - 尝试使用 thrift 的 TFileTransport 和 TFileProcessor 让 Python 客户端与 Java 服务器对话

java - 使用 JSF 的 Seam 与使用 GWT 的 Seam

java - GCS Hadoop 连接器错误 : ClassNotFoundException: com. google.api.client.http.HttpRequestInitializer ls:方案 gs 没有文件系统

java - 无法在 Android 上使用 XOAUTH 连接到 Gmail IMAP

java - 避免已存在的更新验证并在 Spring MVC 中进行更新

java - 如何从 Oauth2 SSO 服务器注销

java - 使用 java.nio.file.Paths 接口(interface)时缺少方案 (IllegalArgumentException)

java - 设置项目的java home