• Java Stream: можно ли сделать аггрегацию объектов?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    Автор вопроса потерялся, придётся предлагать возможные варианты. Начну с самого простого - группировки в Map соответствующим коллектором:
    Map<String, Integer> map = list.stream()
                                    .collect(Collectors.toMap(Animal::getType,
                                                              Animal::getCount,
                                                              (a, b) -> a + b));

    Чуть более сложный, хоть и проще выглядящий, но существенно более гибкий вариант - группирующий коллектор:
    Map<String, Integer> map = list.stream()
                                   .collect(Collectors.groupingBy(Animal::getType, 
                                                                  Collectors.summingInt(Animal::getCount)));

    Ну и совсем низкоуровневый вариант - написание собственного коллектора:
    List<Animal> aggregated 
      = list.stream()
            .collect(Collector.of(HashMap<String, Integer>::new,
                                  (acc, val) -> acc.compute(val.getType(), (k, v) -> v == null ? val.getCount() : v + val.getCount()),
                                  (l, r) -> {
                                      l.replaceAll((k, v) -> v + r.getOrDefault(k, 0));
                                      return l;
                                  },
                                  acc -> acc.entrySet()
                                            .stream()
                                            .map(e -> new Animal(e.getKey(), e.getValue()))
                                            .collect(Collectors.toList())));
    Ответ написан
    Комментировать
  • Почему текст выводится 3 раза?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Потому, что:
    А. в программе написано именно так делать, и
    Б. эта программа выполняется под Виндой
    (на Линуксе было бы только два раза).

    Подробности
    Метод read(), сам по себе, читает только один байт из входного потока, если он там есть. Но этот поток к нему попадает только после завершения ввода в него символов, т.е. когда в нем оказывается признак конца потока, которым является конец строки.

    Когда на клавиатуре вводят, например, "а" [Enter], в поток попадают три байта:
    "а" (=97)
    [CR] (=13)
    [LF] (=10)

    Последние два, [Возврат каретки] и [Перевод строки] под Виндой и означают традиционно тот самый "конец строки", после которого метод начинает читать, a под Линуксом это был бы только один байт 10. А дальше программа сравнивает каждый из них (разумеется, предвaрительно приведенный по значению к char) с "q" (=113), и, т.к. ни один из них не равен этому значению, уходит на новую итерацию.

    Вот так станет понятнее, что и почему там происходит:
    public static void main(String[] args) throws Exception {
            char ch;
            do {
                System.out.println("Press a key followed by ENTER: ");
                ch = (char) System.in.read();
                System.out.println("Entered: '" + ch + "' (=" + (int)ch + ")");
            } while (ch != 'q');
        }

    Кстати, ничто не мешает пользователю ввести больше одного символа до того, как он нажмет Enter... попробуйте сами, а потом подумайте, как исправить программу, чтоб она делала именно то, что от нее ожидается ))
    Ответ написан
    Комментировать
  • Готовый сервлет. Вопрос к опытным front end девелоперам и тим лидам. Кто может поделиться или где искать?

    dummyman
    @dummyman
    диссидент-схизматик
    Вы написали столько преложений. Описание вопроса просто поражает. Из него не только не понятно что вам конкретно нужно, но и близко тематику вашей деятельности. Для ПМ имхо должны были описать проблему раз в 10 короче и ближе к теме.

    Готовые решения есть. Пробовали BizTalk?

    Судя по названию должен быть не таким и бизТалковым. Настраивается мышкой, в лучших традициях мелкомягких.

    Сам сервлет никак не может быть готовым решением и вообще чисто программерское понятие.
    Вот пример из википедии
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    public class NewServlet extends HttpServlet {
       
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            // Параметр
            String parameter = request.getParameter("parameter");
    
            // Старт HTTP сессии
            HttpSession session = request.getSession(true);
            session.setAttribute("parameter", parameter);
    
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            try {
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Заголовок</title>");
                out.println("</head>");
                out.println("<body>");
                out.println("<h1>Пример сервлета"+parameter+"</h1>");
                out.println("</body>");
                out.println("</html>");
            } finally {
                out.close();
            }
        } 
    
        @Override
        public String getServletInfo() {
            return "Пример сервлета";
        }
    
    }
    Ответ написан
    Комментировать
  • Как запустить приложение в ubuntu с заданным разрешением?

    @ashumkin
    системный разработчик
    можно запустить второй X-сервер, сменить у него разрешение, и в нём запускать IDEA
    Ответ написан
    Комментировать
  • Как в jenkins запупустить бинарник перед сборкой?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    А почему нельзя запускать бинарник уже в самом шаге сборки, добавив его вызов в Execute shell script?
    кто пишет диалог - ваш бинарник?
    Ответ написан
    2 комментария