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

Java流收集到Map

宋昕
2023-03-14

我使用的是java 11,我有一个名为MyObject的对象列表,看起来像这样

public class MyObject {
  private final String personalId;
  private final Integer rowNumber;
  private final String description;
<...>
}

我想使用流将这些对象收集到地图中

我试着用收集器来做。toMap(),但似乎不可能做到这一点

myList
.stream()
.Collectors.toMap(s -> s.getPersonalId(), s -> Collectors.toMap(t-> s.getRowNumber(), ArrayList::new))

我的问题是可以制作一张地图吗

共有1个答案

陆才俊
2023-03-14

在您的情况下,我将首先创建地图,然后循环遍历此列表中的元素,如图所示:

Map<String, List<MyObject>> rows = new HashMap<>(); 
list.forEach(element -> rows.getOrDefault(element.rowNumber, new ArrayList<MyObject>()).add(element));

您可以使用getOrAddDefault创建一个新的列表/映射作为映射的值,然后再将数据放入。

您创建的第二种数据类型也是如此:

Map<String, Map<Integer, MyObject>> persons = new HashMap<>();
list.forEach(element -> persons.getOrDefault(element.personalId, new HashMap<>()).put(element.rowNumber, element));

以下是使用流解决此问题的方法:

Map<String, List<MyObject>> rows = list.stream().collect(
        Collectors.toMap(element -> element.personalId, 
        element -> new ArrayList<MyObject>(Arrays.asList(element))));

以及其他地图:

    Map<String, Map<Integer, MyObject>> persons = list.stream().collect(
            Collectors.toMap(e -> e.personalId, 
            e -> new HashMap<>(Map.of(e.rowNumber, e))));
 类似资料:
  • 为了更好地理解新的流API,我试图转换一些旧代码,但我被困在这一个。 我似乎无法为它创建有效的收集器:

  • 我想获取地图的值,找到min值,并为地图的每个条目构造一个新的CodesWitMinValue实例。我希望使用Java11个流,我可以在多行中使用多个流(一个用于min值,一个用于转换)来实现这一点。是否可以使用java 11流和收集器在单行中实现?谢谢。

  • 我有一个列表,我想用流过滤,抓取前10个,并显示给用户。按下按钮后..我想从那个位置继续流。 但问题是,这里我不得不在第一个10+多个不匹配的过滤器上运行过滤器(再次)。

  • 什么时候使用和?有没有人有好的、具体的例子来说明什么时候走一条路或者走另一条路更好呢? Javadoc提到collect()是一个可变约简。 以上的说法是猜测,然而,我希望一个专家在这里插话。

  • 我有一个列表的地图,并希望收集所有的值,然后流在收集的列表上,所以给出:- 下面的工作/显示了我想用迭代做什么,但我想在流中做这些,而不是使用迭代创建一个中间列表:- 因此,我希望将列表的映射流化到一个列表中,然后在一个流中处理该子列表,而不是必须在两个语句中完成上述操作(即通过迭代构建列表,然后进行流化以筛选/排序和收集)。 到目前为止,我还没有做到这一点,当我尝试流式/收集地图时,我会遇到编译

  • 我想做以下事情: 但在某种程度上,结果列表是Guava的<code>ImmutableList<code>的实现。 我知道我可以做到 但我想直接收集它。我试过了 但它抛出了一个异常: java.lang.UnsupportedOperationException at com.google.common.collect.ImmutableCollection.add(ImmutableCollec