当前位置: 首页 > 知识库问答 >
问题:

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

臧友樵
2023-03-14

我有一个类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;
        }
}

我想将列表 映射到在单个流中同时包含stringA和stringB的列表

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个答案

涂羽
2023-03-14

您可以一个一个列出所有值的列表,如下所示:

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

传递给flatmap函数将应用于每个元素,生成一个stream 。这里需要使用flatmap来将所有嵌套的 > 折叠为,从而使我们能够将元素收集到列表 中。

 类似资料:
  • 你好,我的问题与Java8非常相似:流映射同一个流中的两个属性,但由于某些原因,我无法让代码正常工作。 所以就像这个问题一样,假设我有一个班级 所以我想从列表中组合这些

  • 我需要将Java转换为的实例(包括映射内容) 我应该用什么来代替来使此代码可编译?

  • 我有两份清单: 列表1: Object1(name1, id1) 列表2: Object2(name2, id2) 给定list1的大小与list2相同 我想迭代list2,如果list2的name2不为null,则更新list1的name1。 以下是使用旧java的代码: 用java实现这一点的最佳方法是什么。util。流动

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 假设我有以下工作的lambda表达式: 我想在过滤器语句之前创建一个具有2个值的流。所以我想做一个映射,但仍然保留原始值。我想实现这样的事情: 这可能与Java8流?我已经看了收集(GroupingBy()),但仍然没有成功。

  • 问题内容: 我对java8流中和方法之间的区别感到困惑。例如, 我得到空的输出在这里,但如果我改变地图就像 我可以得到 {1 = 1,2 = 2} 为什么只是没有运行方法?它们之间有什么区别? 问题答案: 什么都不做,因为在执行终端操作之前不会处理流管道。因此,残留物为空。 在流管道中添加终端操作将导致针对终端操作所需的每个元素执行操作(某些终端操作仅需要一个元素,而其他终端操作则需要的所有元素)