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

Java8:流映射同一流中的两个属性,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个带有以下签名的class模型: class Model { private String stringA; private String stringB; public Model(String stringA, String stringB) { this.stringA = stringA; this.stringB = stringB; } publi

我有一个带有以下签名的class
模型

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;
        }
}
我想将一个
列表
映射到一个
列表
,该列表在一个流中同时包含stringA和stringB

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

List 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"};
ab型=新型号(“A”、“B”);
型号cd=新型号(“C”、“D”);
列出stringsFromModels={“A”、“B”、“C”、“D”};

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

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

传递给
flatMap
的函数将应用于产生
流的每个元素。这里需要使用
flatMap
将所有嵌套的
折叠为
,从而使我们能够将元素收集到
列表中
flatMap
是您的朋友吗:

models
    .stream()
    .flatMap(model -> Stream.of(model.getStringA(),model.getStringB()))
    .collect(Collectors.toList());
flatMap
接受类型R,并期望返回新类型RR的流(来自列表、集合、数组)。对于每个
1
模型,您将获得
n
新元素(在本例中为
StringA
StringB
):

所有
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
,例如,当您有多个元素集合/流需要合并为一个元素时。要获得更简单的解释,请勾选此

当您说“StringA和StringB都是”时,您是指串联吗?或者您的
列表中是否应该包含
模型的
字符串A
索引
0
,然后是
模型的
字符串b
索引
0
,然后是[…]索引
1
等等?流通常不喜欢增加大小,这不是它通常的行为方式,你可以通过使用
flatMap
来实现你想要的,但那会很难看。有什么原因不想对
循环使用传统的
吗?@Mena我是说第二种方法,所以
列表字符串
应该包含模型中的每个字符串,包括stringA和stringB。我将提供一个例子。@luk2302这是实际的解决方案,但我想知道我是否可以在Stream中解决它,然后答案是“是的,但它既不美观,也不会有更好的性能”@Sunflame欢迎您。如果有助于澄清答案的话,我还添加了一些额外的解释:)。谢谢,现在如何使用
flatMap
,我想它用于将
Collection
s或
Iterable
s合并到一个流中。这真的很有帮助。
models
    .stream()
    .flatMap(model -> Stream.of(model.getStringA(),model.getStringB()))
    .collect(Collectors.toList());
{model_1[String_A1,String_B1] , model_2[String_A2,String_B2] , model_3[String_A3,String_B3]}