Обработайте результат несколько раз, используя Java Stream - PullRequest
0 голосов
/ 12 апреля 2019

Как мне преобразовать в Java Stream часть for-loop в следующих кодах?

    Map<String, String> attributes = new HashMap() {{
        put("header", "Hello, world!");
        put("font", "Courier New");
        put("fontSize", "14px");
        put("color", "#0000ff");
        put("content", "hello, world" +
                "");
    }};
    Path templatePath = Paths.get("C:/workspace/spring-boot-demos/something.tpl");
List<String> lines = Files.readAllLines(templatePath).stream()
                .filter(Objects::nonNull)
                .map(line -> {
                    String parsedLine = "";
                    for (int i = 0; i < attributes.size(); i++) {
                        if (parsedLine.equals("")) parsedLine = this.parse(attributes, line);
                        else parsedLine = this.parse(attributes, parsedLine);
                    }

                    return parsedLine;
                })
                .collect(Collectors.toList());

public String parse(Map<String, String> attributes, String line) {
        return attributes.entrySet().stream()
                .filter(attributeMap -> line.indexOf("{{" + attributeMap.getKey() + "}}") != -1)
                .map(attributeMap -> {
                    String attributeKey = attributeMap.getKey();
                    String attributeValue = attributeMap.getValue();
                    String newLine = line.replace("{{" + attributeKey + "}}", attributeValue);
                    return newLine;
                })
                .findFirst().orElse(line);
    }

Мне трудно реализовать ее Java 8 Stream так, чтобы яЯ вынужден сделать это старой for-loop конструкцией.Причиной этого является то, что для каждой строки строки может быть один или несколько заполнителей (используя {{}} разделитель).У меня есть список (attributes, HashMap) значения, чтобы заменить их.Я хочу убедиться, что перед тем, как цикл Stream покинет каждую строку, все заполнители должны быть заменены значением из Map.Без этого заменяется только первый заполнитель.

Спасибо.

Обновление: это содержимое something.tpl файла:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <title>HTML Generator</title>
        <style>
            body {
                font-family: "{{font}}";
                font-size: {{fontSize}};
                color: {{color}};
            }
        </style>
    </head>
    <body>
        <header>{{header}}</header> {{content}}
        <main>{{content}}</main>
        <h1>{{header}}</h1>
    </body>
</html>

1 Ответ

2 голосов
/ 12 апреля 2019

То есть вы хотите заменить каждый токен в данном списке?

Вот как я бы это сделал с потоками:

  1. Итерация по строкам
  2. парсинг каждогострока только один раз
  3. анализ выполняет итерации по атрибутам и заменяет текущий атрибут

String[] pLine может быть, если вы отсутствовали ...

package so20190412;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Snippet {

    public Snippet() {
    }

    public static void main(String[] args) {        

        Map<String, String> attributes = new HashMap<String, String> () {{
            put("john", "doe");
            put("bruce", "wayne");
        }};
        List<String> lines = Arrays.asList("My name is {{john}}, not {{bruce}}.", "Hello, {{john}}!", "How are you doing?");

        new Snippet().replaceAll(attributes, lines).forEach(System.out::println);

    }

    public List<String> replaceAll(Map<String, String> attributes, List<String> lines) {
        return lines.stream().map(l -> parse(attributes, l)).collect(Collectors.toList());
    }

    public String parse(Map<String, String> attributes, String line) {
        String[] pLine = {line};
        attributes.entrySet().stream()
                .forEach(attr -> {
                    String attributeKey = attr.getKey();
                    String attributeValue = attr.getValue();
                    String newLine = pLine[0].replace("{{" + attributeKey + "}}", attributeValue);
                    pLine[0] = newLine;
                });
        return pLine[0];
    }
}

Не стесняйтесь спрашивать, если вы не понимаете какую-то часть.

HTH!

...