首页 > 解决方案 > Java 8 按具有不同分隔符的第一个字符串属性分组

问题描述

从一个对象并通过 Java 8 流/收集器功能,我想创建一个由 2 个不同分隔符组成的字符串。“/”分隔同一类的选项,分隔不同的类。

预期输出结果:

AJOUT option1 test / AJOUT option3 test </br> 
SUPPRESSION option2 test </br>
MODIFICATION option4 test / MODIFICATION option5 test

备注:

这是我的尝试:

1- 用“/”分隔所有选项

String description = orderCapture.getSelectedOptions().stream()
                    .map(option -> String.format("%s %s", option.getAction().getLabel(), option.getLabel()))
                    .collect(Collectors.joining(" / "));

结果

AJOUT option1 test / SUPPRESSION option2 test / AJOUT option3 test / MODIFICATION option4 test / MODIFICATION option5 test

2- 用“ &lt;br/&gt”(</br>)分隔所有选项

String description = orderCapture.getSelectedOptions().stream()
                    .map(option -> String.format("%s %s", option.getAction().getLabel(), option.getLabel()))
                    .collect(Collectors.joining(" &lt;br/&gt "));

结果

AJOUT option1 test </br> SUPPRESSION option2 test </br> AJOUT option3 test </br> MODIFICATION option4 test </br> MODIFICATION option5 test

3-我的最后一次尝试是用 br 标签分隔类别,但它不起作用

String description = orderCapture.getSelectedOptions().stream()
                    .map(option -> String.format("%s %s", option.getAction().getLabel(), option.getLabel()))
                    .collect(Collectors.groupingBy(option -> option.getAction().getLabel()), 
                             Collectors.joining(" &lt;br/&gt "));

结果

日食错误:

任何帮助将不胜感激,谢谢。

标签: javacollectionsjava-8java-stream

解决方案


您可能已经注意到,您的第一个实现对于遍历列表Option是否正确分组很有用。因此,将其用作下面的实用方法-

private static String describeSimilarActions(List<Option> options) {
    return options.stream()
            .map(option -> String.format("%s %s", option.getAction().getLabel(), option.getLabel()))
            .collect(Collectors.joining(" / "));
}

然后Action按预期根据标签进行分组以提供适当的换行符可以帮助如下:

String description = orderCapture.getSelectedOptions().stream()
        .collect(Collectors.groupingBy(op -> op.getAction().getLabel())) // this
        .values().stream()
        .map(opList -> describeSimilarActions(opList)) // reuse
        .collect(Collectors.joining("\n"));

推荐阅读