展平地图<整数,地图<string,=“”boolean =“”>&gt;到List <boolean>

时间:2017-12-09 21:27:58

标签: java java-8 java-stream

使用java 8流,如何将Map<Integer, Map<String, Boolean>>展平为List<Boolean>,以便最终列表包含所有值中的所有布尔值?

以下是数据示例:

1 -> [{"ABC" -> true}, {"DEF" -> true}]
2 -> [{"DEF" -> false}, {"EFG" -> true}]
3 -> [{"ABC" -> true}, {"DEF" -> false}]

我想将其展平为List<Boolean>,以便我的列表包含:

{true, true, false, true, true, false}

订单并不重要。内容很重要。

4 个答案:

答案 0 :(得分:2)

试试这个:

        Map<Integer, Map<String, Boolean>> map = new HashMap<Integer, Map<String, Boolean>>();
        final List<Boolean> collect = map
            .values()
            .stream()
            .flatMap(it -> it.values().stream())
            .collect(Collectors.toList());

答案 1 :(得分:1)

您可以执行以下操作:

  final Map<Integer, List<Entry>> map = new HashMap<>();
  map.put(1, Arrays.asList(new Entry("ABC", true), new Entry("DEF", true)));
  map.put(2, Arrays.asList(new Entry("DEF", false), new Entry("EFG", true)));
  map.put(3, Arrays.asList(new Entry("ABC", true), new Entry("DEF", false)));

  final List<Boolean> booleans = map.entrySet()
      .stream()
      .flatMap(entry -> entry.getValue().stream())
      .map(entry -> entry.value)
      .collect(Collectors.toList());

  System.out.println(booleans);

但请注意,此订单不会保存在此处,因为这是HashMap

答案 2 :(得分:1)

看看以下内容:

final List<Boolean> collect = map.values().stream() // Stream<Map<String,Boolean>>
    .map(Map::values)                               // Stream<Collection<Boolean>>
    .flatMap(Collection::stream)                    // Stream<Boolean>
    .collect(Collectors.toList());    

与此答案和其他答案的不同之处在于,每行只包含一个操作(我个人更喜欢,更易读)。

答案 3 :(得分:0)

基于

  

我想将其扁平化为List,以便我的列表包含:{true,true,false,true,true,false}

解决方案可能就像这样

Map<Integer, Map<String, Boolean>> map = new HashMap<>();
    map.put(1, new HashMap<String, Boolean>(){{put("ABC", true);put("DEF", true);}});
    map.put(2, new HashMap<String, Boolean>(){{put("DEF", false);put("EFG", true);}});
    map.put(3, new HashMap<String, Boolean>(){{put("ABC", true);put("DEF", false);}});

    System.out.println(map.entrySet().stream().flatMap( t -> t.getValue().values().stream()).collect(Collectors.toList()));