Как использовать Consumer для OutputStream

Дана мапа и в нее надо добавить следующие данные ключ "Hello" значение "Hello my dear friend\r\n\r\n" добавить вот так map.put("Hello", out -> ...); потом достать используя следующую конструкцию - map.getOfDefault(msg, (out) -> ...).apply(out); Не пойму как тут можно использовать Consumer. Буду благодарен за подсказки

private static void writeInOut(String value, OutputStream out, ServerSocket server) throws IOException {
        Map<String, Consumer<OutputStream>> map = new HashMap<>();
}

Написал метод но он получился очень длинный можно ли его отрефакторить как то?

private static void writeInOut(String value, OutputStream out, ServerSocket server) throws IOException {
        Map<String, Consumer<OutputStream>> map = new HashMap<>();
        out.write("HTTP/1.1 200 OK\\r\\n\\r\\n".getBytes());
        out.write(System.lineSeparator().getBytes());
        if (value.contains("Hello")) {
            map.put("Hello", x -> {
                try {
                    x.write("Hello my dear friend\r\n\r\n".getBytes());

                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            map.getOrDefault("Hello", null).accept(out);
        }


 if (value.contains("Any")) {
                map.put("Any", x -> {
                    try {
                        x.write("What\r\n\r\n".getBytes());

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
                map.getOrDefault("Any", null).accept(out);
            }
            if (value.contains("Exit")) {
                map.put("Exit", x -> {
                    try {
                        x.write("GoodBye My Dear friend\r\n\r\n".getBytes());
                        server.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
                map.getOrDefault("Exit", null).accept(out);
            }
        }

Ответы (1 шт):

Автор решения: insolor

Столько проверок не нужно. Просто создаете Map, добавляете в него нужные значения (это вообще по идее можно один раз при запуске программы в отдельном методе делать), потом по значению value получаете нужное Consumable, и вызываете у него метод accept. При получении getOrDefault вторым параметром передаете Consumable, которое должно вызываться, если переданного ключа нет в Map.

private static void writeInOut(String value, OutputStream out, ServerSocket server) throws IOException {
    Map<String, Consumer<OutputStream>> map = new HashMap<>();
    map.put("Hello", outputStream -> {
        try {
            outputStream.write("Hello my dear friend\r\n\r\n".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
    map.put("Any", outputStream -> {
        try {
            outputStream.write("What\r\n\r\n".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    });
    map.put("Exit", outputStream -> {
        try {
            outputStream.write("GoodBye My Dear friend\r\n\r\n".getBytes());
            server.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    });

    out.write("HTTP/1.1 200 OK\\r\\n\\r\\n".getBytes());
    out.write(System.lineSeparator().getBytes());

    map.getOrDefault(value, outputStream -> {
        try {
            outputStream.write("Don't understand\r\n\r\n".getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }).accept(out);
}
→ Ссылка