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

使用Stream将String 2D数组映射到新对象

龙枫
2023-03-14

我有一个POJO旅行者,变量为字符串name,字符串city。我有一个字符串数组,比如

List<String[]>  events = Arrays
            .asList(new String[][] { { "Person A", "City 1" },{ "Person A", "City 1" }, { "Person A", "City 2" }, { "Person B", "City 1" },
                    { "Person B", "City 3" }, { "Person C", "City 2" }, { "Person C", "City 4" } });

我想要一张地图,上面有名字和城市列表。

Map<String, List<String>> map = events.stream().map(traveller ->  Traveller :: new).collect(Collectors.groupingBy(Traveller::getName));

我无法给旅行者绘制地图。有没有一种方法可以为旅行者绘制地图,并将其名称作为重点和城市列表。

共有2个答案

颜修为
2023-03-14

我看不到将其转换为Traveller对象的优势,所以您可以直接使用Collectors.groupingBy基于数组中的名称和Collectors.mapping来映射<代码>城市(列表

Map<String, List<String>> res = events.stream().collect(Collectors.groupingBy(key -> key[0].split(" ")[1],
            Collectors.mapping(val -> val[1].split(" ")[1], Collectors.toList())));
居乐池
2023-03-14

Traveler::new不正确从数组创建对象,您的方式不正确,您必须使用:

Map<String, List<Traveller>> map = events.stream()                   
        .map(traveller -> new Traveller(traveller[0], traveller[1])) // 1
        .collect(Collectors.groupingBy(Traveller::getName));         // 2
  1. 在类中创建一个包含city和name的构造函数

从OP评论中:

我希望作为结果的地图与人名的关键和城市的列表作为值

在这种情况下,您必须使用:

Map<String, List<String>> map = events.stream()
        .map(traveller -> new Traveller(traveller[0], traveller[1]))
        .collect(Collectors.groupingBy(Traveller::getName, 
                Collectors.mapping(Traveller::getCity, Collectors.toList())));

但是,我不会采用创建事件的方法,而是使用Traveller而不是列表

List<Traveller> events = Arrays.asList(new Traveller("Person A", "City 1"), new Traveller("Person A", "City 1"),
        new Traveller("Person A", "City 2"), new Traveller("Person B", "City 1"),
        new Traveller("Person B", "City 3"), new Traveller("Person C", "City 2"), new Traveller("Person C", "City 4"));

那么你可以只使用:

Map<String, List<String>> collect = events.stream()
        .collect(Collectors.groupingBy(Traveller::getName,
                Collectors.mapping(Traveller::getCity, Collectors.toList())));

 类似资料:
  • 我想把下面的数组转换成一个稍微修改的对象(见下文)。我也在尝试使用扩展运算符,但还没有弄清楚如何做到这一点。我试图避免使用lodash(用于教育目的)。 null

  • 我正在尝试将我的对象[]数组映射并过滤到int[]数组。如果对象是int,效果很好,但如果不是int,则抛出强制转换异常。我想知道我是否可以在lambda表达式中附加一个try/catch?这是我的代码: 或者更好的方法是试着抓住整个街区?

  • 使用一个函数将数组的值映射到对象,其键值对中,原始值作为键,映射值作为值。 使用一个匿名的内部函数作用域来声明一个 undefined 的内存空间,使用闭包来存储返回值。 使用一个新的 Array 来存储带有函数映射的数组和一个逗号运算符来返回第二个步骤,而不需要从一个上下文移动到另一个上下文(由于闭包和操作顺序)。 const mapObject = (arr, fn) => (a => (

  • JSONMappingException:无法反序列化com.demo.json.model.abc实例 编辑:我的POJO如下所示: 有人能提出解决办法吗? 有人能帮我做这个吗?

  • 我正试图利用谷歌电子表格(谷歌脚本)中的地图功能,使用API从Bittrex获取我的帐户硬币余额。这是我的JSON对象: 理想情况下,我希望根据结果中的键和使用每个对象数据的基础行自动填充标题行。我看到了spme解决方案如何为每种或更复杂的方式使用。但我想这可以通过映射来实现。下面是我如何映射顶行,但不知道如何映射值: 谷歌电子表格中的预期输出为

  • 我编写了货币转换器程序,从,映射对象并创建选定速率的简单数据集。我的程序运行得很好,直到我停止使用解析和映射对象,并用替换它。它可以很好地读取基础货币和日期,但不能读取<代码>汇率 子对象。为什么? 我的代码:类别: 类: 必须使用映射对象的类: 我试图解析和映射的示例JSON数据 我正在使用这个对象来准备对象,该对象具有一个简单的