Java8:流映射同一流中的两个属性

2022-09-03 18:15:10

我有一个具有以下签名的类:Model

class Model {
        private String stringA;
        private String stringB;

        public Model(String stringA, String stringB) {
            this.stringA = stringA;
            this.stringB = stringB;
        }

        public String getStringA() {
            return stringA;
        }

        public String getStringB() {
            return stringB;
        }
}

我想将 a 映射到在单个流中同时包含字符串 A 和字符串 B 的List<Model>List<String>

List<String> strings = models.stream()
                .mapFirst(Model::getStringA)
                .thenMap(Model::getStringB)
                .collect(Collectors.toList());

艺术

List<String> strings = models.stream()
                .map(Mapping.and(Model::getStringA,Model::getStringB))
                .collect(Collectors.toList());

当然,它们都没有编译,但你明白了。

这在某种程度上可能吗?

编辑:

例:

Model ab = new Model("A","B");
Model cd = new Model("C","D");
List<String> stringsFromModels = {"A","B","C","D"};

答案 1

您可以一个接一个地列出所有值,如下所示:

List<String> resultSet =
               modelList.stream()
                        .flatMap(e -> Stream.of(e.getStringA(), e.getStringB()))
                        .collect(Collectors.toList());

传递给的函数将应用于每个元素,从而生成一个 .这里有必要使用,将所有嵌套折叠为 a,从而使我们能够将元素收集到 .flatMapStream<String>flatMapStream<Stream<String>>Stream<String>List<String>


答案 2

flatMap是你在这里的朋友:

models
    .stream()
    .flatMap(model -> Stream.of(model.getStringA(),model.getStringB()))
    .collect(Collectors.toList());

flatMap采用类型 R,并期望返回新类型 RR 的流(来自列表、集合、数组)。对于每个模型,您都会获得新元素(在本例中为和):1nStringAStringB

{model_1[String_A1,String_B1] , model_2[String_A2,String_B2] , model_3[String_A3,String_B3]}

您的所有元素n { [String_A1,String_B1], [String_A2,String_B2],[String_A3,String_B3]}

然后被压平,放置在具有结构的新流中

{String_A1,String_B1,String_A2,String_B2,String_A3,String_B3}

类型字符串。这就是您拥有新流的方式。

例如,当您有许多元素的集合/流只需要合并到一个元素中时,您可以使用。有关更简单的解释,请查看此答案flatMap


推荐