首页 > 解决方案 > 迭代arraylist并通过分组值发送电子邮件

问题描述

我有一个如下所示的 ArrayList

ArrayList<String> fList = new ArrayList<>();
    fList.add("100510-0001");
    fList.add("100510-0001");
    fList.add("100513-0004");
    fList.add("100510-0002");
    fList.add("100510-0001");
    fList.add("100513-0005");
    fList.add("100513-0006");
    fList.add("100518-0006");
    fList.add("100599-0001");
    fList.add("100593-0009");

我需要根据列表值的前 6 个字符发送电子邮件。

示例:我在列表中重复了 4 次 100510,所以我需要在同一封电子邮件中发送所有 4 条记录,如下面的硬编码之一。

我有 100513 3 次,我可以有 n 个列表,但我需要进行递归/迭代并发送具有相同记录的电子邮件,即 100510 在单独的电子邮件中,100513 在单独的电子邮件中等等......

有什么帮助吗?

ArrayList<String> subList = new ArrayList<>();
    for (int i = 0; i < fList.size(); i++) {
       String subString =  fList.get(0).split("-")[0];
        if(fList.get(i) == "100510"){
            subList.add(fList.get(i));
            createEmail(subList);
        }
        if(fList.get(i) == "100513"){
            subList.add(fList.get(i));
            createEmail(subList);
        }
    }

标签: javaarraysloopsfor-loopjava-8

解决方案


如果您只需要为每个“前缀”发送一封电子邮件,那么您需要做的就是分组:

Map<String, List<String>> distinctMap = fList.stream()
            .collect(Collectors.groupingBy(s -> s.split("-")[0]));

distinctMap.forEach((str1, list) -> {
    System.out.println("Sending e-mail for prefix " + str1);
    createEmail(list);
});

当然你可以使用你的 for 循环来做到这一点,但你应该只在所有迭代之后发送电子邮件:

Map<String, List<String>> emailsByPrefix = new HashMap<>();

for (int i = 0; i < fList.size(); i++) {

    String subString = fList.get(i).split("-")[0];

    emailsByPrefix.merge(subString, Arrays.asList(fList.get(i)), (list1, list2) -> {
        List<String> merged = new ArrayList<>();
        merged.addAll(list1);
        merged.addAll(list2);

        return merged;
    });
}

for (Entry<String, List<String>> emailEntry : emailsByPrefix.entrySet()) {
    System.out.println("Sending e-mail for prefix " + emailEntry.getKey());
    createEmail(emailEntry.getValue());
}

推荐阅读