Java,Collectors.toList()只创建一个元素

时间:2017-04-08 21:15:03

标签: java java-stream collectors

我遇到麻烦让以下工作。这项任务的重点是使用流:

Map<String, List<String>> descriptions = new HashMap<>();
wordArray[2] = "D1_E1^E2^E3^E4~D2_E1^E2";
if(wordArray[2].contains("~")) {
    Arrays.stream(wordArray[2].split("~"))
            .forEach(s -> descriptions.put(s.split("_")[0],
                   s.split("_")[1].contains("^")
                           ? Arrays.stream(s.split("_")[1].split("^"))
                                    .collect(Collectors.toList()) 
                               : Arrays.asList(s.split("_")[1])));
}

由于某种原因,此Collectors.toList()仅创建一个字符串"E1^E2^E3^E4"而不是单独的字符串。 我的猜测是,这是我错的地方:Arrays.stream(s.split("_")[1].split("^")),但我不知道究竟在哪里以及如何解决它。更是如此,因为它的工作正常,与上面的相似:

List<String> synonyms = new ArrayList<>(); 
wordArray[3] = "S1_S2_S3_S4";
synonyms = wordArray[3].contains("_")
                            ? Arrays.stream(wordArray[3].split("_")).
                                  collect(Collectors.toList())
                            : Arrays.asList(wordArray[3]);

谢谢!

1 个答案:

答案 0 :(得分:2)

不确定您的预期输出应该是什么,但是如果它是这样的

  

[D1,E1,E2,E3,E4,D2,E1,E2]

然后,您可以使用Java流执行此操作的方法之一是:

import java.util.List;
import java.util.stream.Stream;

import static java.util.stream.Collectors.toList;

public class Parser {
    public static void main(String[] args) {
        String str = "D1_E1^E2^E3^E4~D2_E1^E2";
        List<String> strings = Parser.parseString(str);
        System.out.println(strings);
    }

    public static List<String> parseString(String str) {
        return Stream.of(str)
                .map(s -> s.replaceAll("[_^~]", "-").split("-"))
                .flatMap(Stream::of)
                .collect(toList());
    }
}

从这里你可以分解正则表达式并将其作为第二个参数传递给parseString,以获得更大的灵活性(如果需要)。