正在处理地图列表<;字符串,列表<;对象>&燃气轮机;在Java8中

正在处理地图列表<;字符串,列表<;对象>&燃气轮机;在Java8中,java,java-8,java-stream,Java,Java 8,Java Stream,我正在尝试从地图列表中创建一个地图。它只包含键“1”和使用Java8流API的该列表下不同映射中键“1”的所有值 List<Map<String,Object>> list=new ArrayList<>(); Map<String,Object> map1=new HashMap<>(); map1.put("1", Arrays.asList(new String[] {"A"})); map1.put("2", Arrays.as

我正在尝试从地图列表中创建一个地图。它只包含键“1”和使用Java8流API的该列表下不同映射中键“1”的所有值

List<Map<String,Object>> list=new ArrayList<>();
Map<String,Object> map1=new HashMap<>();
map1.put("1", Arrays.asList(new String[] {"A"}));
map1.put("2", Arrays.asList(new String[] {"B"}));

Map<String,Object> map2=new HashMap<>();
map2.put("1", Arrays.asList(new String[] {"C"}));
map2.put("2", Arrays.asList(new String[] {"D"}));
List List=new ArrayList();
Map map1=新的HashMap();
map1.put(“1”,Arrays.asList(新字符串[]{“A”}));
map1.put(“2”,Arrays.asList(新字符串[]{“B”}));
Map map2=新的HashMap();
map2.put(“1”,Arrays.asList(新字符串[]{“C”}));
put(“2”,Arrays.asList(新字符串[]{“D”}));

所需输出:-
{1=[A,C]}

因为您只有一个条目,所以在本例中,您只需要关注值,对于键,您可以使用
“1”
,因为您可以创建如下映射:

Map<String, List<String>> result = new HashMap<>();
result.put("1", list.stream()
        .filter(e -> e.containsKey("1"))
        .flatMap(e -> e.values().stream())
        .flatMap(List::stream)
        .collect(Collectors.toList()));
Map result=newhashmap();
result.put(“1”,list.stream()
.过滤器(e->e.containsKey(“1”))
.flatMap(e->e.values().stream())
.flatMap(列表::流)
.collect(Collectors.toList());
或如评论中所述,您也可以使用:

Map<String, List<String>> result = list.stream()
    .filter(e -> e.containsKey("1"))
    .flatMap(e -> e.values().stream())
    .flatMap(List::stream)
    .collect(Collectors.groupingBy(t -> "1"));
Map result=list.stream()
.过滤器(e->e.containsKey(“1”))
.flatMap(e->e.values().stream())
.flatMap(列表::流)
.收集(收集器.分组方式(t->“1”);
您可以执行以下操作:

Map<String, List<Object>> result = list.stream()
            .filter(entry -> entry.containsKey("1"))
            .map(entry -> (List<Object>) entry.get("1"))
            .collect(Collectors.toMap(t1 -> "1", 
                          ArrayList::new, (l1, l2) -> { l1.addAll(l2);return l1; }));
如所述,您应该将
list
声明为:
list

您可以使用
groupingBy
收集器:

Map<String, List<String>> result = list.stream()
    .map(m -> m.get("1"))
    .filter(Objects::nonNull)
    .flatMap(Collection::stream)
    .collect(Collectors.groupingBy(t -> "1"));

为什么不将
list
声明为
list
?否则,为什么
{1=[[A],[C]}
不是预期的输出?@ernest_k我可以将声明更改为List,但我需要输出为{1=[A,C]}。{1=[A,C]}将是列表的列表,对吗?@Chirag-right,这正是你现在不清楚的问题。考虑到当前的代码和作为输入类型的
列表
,您应该问自己的第一个问题是,为什么需要如此复杂的数据表示,是否没有办法简化它?@Naman需要从一个进程返回两个列表。所以我为它维护了一个映射,这个过程可以返回多个映射,这使它成为一个映射列表。任何更好的建议如果你不想直接放入地图,你可以使用groupingBy收集器而不是toList:
.collect(Collectors.groupingBy(i->“1”,i->i))
@LinosaysMonica对不起,我是说
groupingBy(i->“1”)
。我还注意到你的代码没有编译。你的流收集到一个
列表中
我想你错过了一个flatMap谢谢@linosays,好主意,我把它放在我的回答中:)为什么不使用
groupingBy
?为什么不使用这个
Map result=List.stream().filter(m->m.containsKey(“1”).flatMap(m->m.get(“1”).stream().collector.groupingBy(l->“1”));@RavindraRanwala这同样有效,但也有效,不是吗?我知道的map实现几乎总是检查
get(key)!=空值
表示
containsKey
Map<String, List<String>> result = list.stream()
    .map(m -> m.get("1"))
    .filter(Objects::nonNull)
    .flatMap(Collection::stream)
    .collect(Collectors.groupingBy(t -> "1"));
Map<String, List<String>> result = list.stream()
    .map(m -> m.get("1"))
    .flatMap(l -> l == null ? Stream.empty() : l.stream())
    .collect(Collectors.groupingBy(t -> "1"));