将Map转换为Array Java

时间:2017-03-23 16:03:23

标签: java arrays hashmap toarray

public Map<String, List<Tuple4>> buildTestcases(ArrayList<Tuple4> list){
        Map<String, List<Tuple4>> map = new LinkedHashMap<String, List<Tuple4>>();


        for(Tuple4 element: list){

            String[] token = element.c.split("\\s");

              if (!map.containsKey(token[1])) {
                  map.put(token[1], new ArrayList<Tuple4>());
              }
            map.get(token[1]).add(element);
        }
        System.out.println(map);

        return map;
    }

 public Tuple4(String a, String b, String c, String d) {
        this.a = a;
        this.b = b;
        this.c = c;
        this.d = d;
    }

我正在为某些匹配的测试用例构建一个Testsuite。现在我想将它转换为数组,因为我正在构建一个dynamicTest:

 return Stream.of(<Array needed>).map(


            tuple -> DynamicTest.dynamicTest("Testcase: ", () -> { ... }

有没有办法将其转换为像Object[String][Tuple4]

这样的数组

修改

好的,现在我有了这段代码:

`@TestFactory     public Stream dynamicTuple4TestsFromStream()抛出IOException {         初始化();

    return map.entrySet().stream()
        .flatMap(entry -> 
                entry.getValue().stream()
                        .map(s -> new AbstractMap.SimpleEntry<>(entry.getKey(), s)))
        .forEach(e -> DynamicTest.dynamicTest("Testcase: " +e.getKey(), () -> {
            tester = new XQueryTester(e.getValue().a, e.getValue().b);
            if(e.getValue().c.contains("PAY")){
                Assert.assertTrue(tester.testBody(e.getValue().c,e.getValue().d)); 

            }

        })); }`

我得到这个例外: incompatible types: void cannot be converted to java.util.stream.Stream<org.junit.jupiter.api.DynamicTest>

如何/为什么?

1 个答案:

答案 0 :(得分:0)

虽然您可以非常轻松地编写代码以将地图转换为数组,但您并非真正需要这样才能获得测试流。

您只需要获取Map.Entry<String,List<Tuple>>的流并将其展平为Map.Entry<String,Tuple>

的流

例如:

    Map<String, List<String>> map = new HashMap<>();
    map.put("Greeting", Arrays.asList("Hello", "World"));
    map.put("Farewell", Arrays.asList("Goodbye", "Suckers"));

    map.entrySet().stream()
            .flatMap(entry -> 
                    entry.getValue().stream()
                            .map(s -> new AbstractMap.SimpleEntry<>(entry.getKey(), s)))
            .forEach(e -> System.out.println(e.getKey() + " " + e.getValue()));

...打印......

Greeting Hello
Greeting World
Farewell Goodbye
Farewell Suckers

当然,如果你真的想要一个数组,你可以改变映射:

 .flatMap(entry -> entry.getValue().stream()
       .map( s -> new Object[] { entry.getKey(), entry.getValue() })

...并将生成的数组流收集到一个数组数组中。但我不明白这一点。

(这将受益于功能分解重构,但它说明了这一点)