Преобразовать файл с текстом, похожим на карту, в настоящий HashMap - PullRequest
1 голос
/ 10 ноября 2019

У меня есть файл ниже со структурой, подобной карте, в каждой строке

sampledatamap.txt
field1=value1,  field2=value2,  field3=value3 ...
field1=value10, field2=value11, field3=value12 ...

Как я могу прочитать файл и преобразовать каждую строку в карту, используя поток Java 8? Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Создайте поток строк, разделите их запятыми, затем '=' и соберите в карту. Затем соберите Карты в Список. Например:

public class Parser {

    public static void main(String[] args) throws IOException {
        Path path = Paths.get("sampledatamap.txt");

        try(Stream<String> lines = Files.lines(path)) {
            List<Map<String, String>> collect = lines
                    .map(Parser::toMap)
                    .collect(Collectors.toList());

            System.out.println(collect);
        }
    }

    static Map<String, String> toMap(String line) {
        return Stream
                .of(line.split(","))
                .map(s -> s.split("="))
                .collect(Collectors.toMap((String[] s) -> s[0], (String[] s) -> s[1]));
    }
}

Может быть не самое чистое решение, но идея показана.

0 голосов
/ 11 ноября 2019
List<Map<String, String>> result = Files.readAllLines(Paths.get("sampledatamap.txt"))
    .stream()
    // transform each line into a stream of "field=value" format
    .map(lineStr -> Stream.of(lineStr.split(",")))
    .map(line -> line
        // transform each of "field=value" format into a Map
        .map(rawStr -> {
            Map<String, String> entry = new HashMap<>();
            String[] kv = rawStr.trim().split("=");
            entry.put(kv[0], kv[1]);
            return entry;
        })
        // merge all the single entry map into a full map
        .reduce(new HashMap<>(), (a, b) -> {
            a.putAll(b);
            return a;
        }))
    .collect(Collectors.toList());

System.out.println(result);
...