• Зачем нужен WebFlux?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    По-моему, хороший ответ даёт вот этот мущщина :)
    Если кратко, использование асинхронного подхода даёт более отзывчивое приложение. При этом оно может и не быть быстрее, но т.к. пользователь начинает быстрее получать первые данные, ему кажется что оно быстрее.
    Ответ написан
  • Как спроектировать отправку данных по консюмерам?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Сделать статус PARTIALLY_SENT и поле с получателями. Можно попробовать писать в базу прямо List или Set, через .toString() преобразовывать в строку вида {"user1", "user2", ... }. Поле каждого получения обновляешь поле, удаляя получателя. Как поле становится пустым - значит всем отправлено... и даже статус не нужен :)
    Можно писать Map (получатель, число_попыток). Map тоже хорошо преобразуется методом .toString(), правда в обратную сторону придётся написать парсер, впрочем, он будет очень простой.
    Ответ написан
    Комментировать
  • Какие курсы выбрать по java?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Если совсем новичковый, то этот или этот. Посложнее, но гораздо полезнее - этот.
    Эти посмотри (на английском).
    Из платных могу посоветовать этот. Там огромное кол-во практики с автоматической проверкой заданий. Очень прокачивает новичков.
    Ответ написан
    4 комментария
  • Как получить элемент List с минимальным индексом объекта?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    как

    Например, используя Stream API :)
    import java.util.List;
    import java.util.Random;
    import java.util.stream.Stream;
    
    public class Test {
      public static void main(String[] args) {
    
        // Create List
        List<MyObj> objects = Stream.generate(MyObj::new).limit(10).toList();
        System.out.println(objects);
    
        // Get minimal index item
        MyObj minIndexObj = objects
          .stream()
          .reduce((a, b) -> a.getIndex() < b.getIndex() ? a : b).orElse(null);
        
        System.out.println(minIndexObj);
    
      }
    }
    
    class MyObj {
      private final int index;
    
      public MyObj() {
        index = new Random().nextInt();
      }
    
      public int getIndex() {
        return index;
      }
    
      @Override
      public String toString() {
        return "MyObj { index= " + index + " }";
      }
    }
    Ответ написан
    Комментировать
  • Какие параметры передать в format в JAVA?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Кнопки "сделать хорошо" в Java нет (ну, иногда есть, но не в этот раз)
    Я вижу следующий путь:
    - разбиваешь исходную строку на слова, помещая их в массив (см. методы класса String);
    - создаёшь новую строку (лучше StringBuilder);
    - идёшь по массиву, добавляя слова в новую строку, подсчитывая кол-во добавленных символов;
    - если новое слово не помещается, вставляешь "перенос строки", обнуляешь счётчик и продолжаешь добавлять слова;
    Ответ написан
  • Как определить три последующие пустые строки в коде JAVA?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    У Row есть метод getLastCellNum(), который вернёт -1 если в данной строке нет созданных ячеек, т.е. он пустой. Можно пройтись по строкам и найти место где 3 раза подряд этот метод возвращает -1.
    Но это годится только если лист создавался кодом. Если это "ручной" файл, то в ячейках м.б. пробелы, бордюры и что-нить ещё, поэтому критерий "пустой" надо будет определять как-то иначе.
    Ответ написан
  • Как устранить ошибку CORS?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Я у себя добавил такую конфигурацию:
    /*
    https://www.baeldung.com/spring-webflux-cors
    https://www.baeldung.com/spring-cors
     */
    
    package com.broadview.bvreportsgenerator.configuration;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.reactive.config.CorsRegistry;
    import org.springframework.web.reactive.config.EnableWebFlux;
    import org.springframework.web.reactive.config.WebFluxConfigurer;
    
    @Configuration
    @EnableWebFlux
    public class CorsGlobalConfiguration implements WebFluxConfigurer {
    
      @Override
      public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
      }
    }


    Это вариант для WebFlux. Если у тебя "обычный" web, будут немного другие вызовы, см. статьи в коменте.
    Ответ написан
    6 комментариев
  • Angular 14, как скачать файл (application/octet-stream)?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Отвечаю сам себе :)
    Главное - придумать правильный запрос в поисковик - и вот он, ответ!
    Ответ написан
    Комментировать
  • Как передать пустое значение в массив?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Что-то ты навертел :) По-моему, так понятнее:
    final List<String[]> splitNames = new ArrayList<>();
        
    for (int i = 0; i < setFullNameList.size(); i++) {
      String[] splitFullName = {"", "", "none"};
      String[] temp = setFullNameList.get(i).split(" ");
    
      if (temp.length < 2) continue;    // некорректный ввод, переходим к следующему
    
      splitFullName[0] = temp[0];
      splitFullName[1] = temp[1];
      if (temp.length == 3) splitFullName[2] = temp[2];
    
      splitNames.add(splitFullName);    // сохраняем массив splitFullName
    }
    Ответ написан
    Комментировать
  • Как с generics получить объект нужного типа?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    В общем, выкладываю два варианта решения: одно, которое мы обсуждали с Dmitry Roo и второе, подсмотренное на SOF. Оба рабочие. Мне больше нравится второе (с Supplier<>), оно компактнее и не надо городить свою фабрику.

    import lombok.Getter;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.function.Supplier;
    
    public class Test {
    
      public static void main(String[] args) {
    
        HandleB handleB = new HandleB();
        handleB.print();
    
        HandleC handleC = new HandleC();
        handleC.print();
    
      }
    }
    
    // ТИПЫ
    @Getter
    abstract class A {
      private String a = "aaa";
    }
    
    @Getter
    class B extends A {
      private String b = "bbb";
    }
    
    @Getter
    class C extends A {
      private String c = "ccc";
    }
    
    class MyFactory{
      private final String type;
    
      public MyFactory(String type) {
        this.type = type;
      }
    
      public A getObject(){
        return switch (type){
          case "B" -> new B();
          case "C" -> new C();
          default -> throw new IllegalStateException("Unexpected value: " + type);
        };
      }
    
    }
    
    // КЛАССЫ для работы с типами
    class HandleB {
      Commons<B> commons = new Commons<>("B");
    
      B instanceB = commons.getObject();
      List<B> list = commons.getList();
    
      void print(){
        System.out.println(instanceB.getB());
      }
    
    }
    
    class HandleC {
      Commons2<C> commons = new Commons2<>(C::new);
    
      C instanceC = commons.getObject();
      List<C> list = commons.getList();
    
      void print(){
        System.out.println(instanceC.getC());
      }
    
    }
    
    // КЛАСС с шаблонным кодом
    
    // вариант с фабрикой
    class Commons<T extends A> {
    
      MyFactory factory;
    
      public Commons(String type) {
        this.factory = new MyFactory(type);
      }
    
      List<T> getList() {
        List<T> list = new ArrayList<>();
    
        for (int i = 0; i < 3; i++) {
          T item = getObject();
          list.add(item);
        }
    
        return list;
      }
    
      T getObject() {
        return (T) factory.getObject();
      }
    
    }
    
    // вариант с Supplier<>
    // https://stackoverflow.com/questions/299998/instantiating-object-of-type-parameter
    class Commons2<T extends A> {
    
      private final Supplier<T> supplier;
    
      Commons2(Supplier<T> supplier) {
        this.supplier = supplier;
      }
    
      List<T> getList() {
        List<T> list = new ArrayList<>();
    
        for (int i = 0; i < 3; i++) {
          T item = getObject();
          list.add(item);
        }
    
        return list;
      }
    
      T getObject() {
        return supplier.get();
      }
      
    }


    Осталось понять как это знание прикрутить к приложению на Spring Boot.
    Как бы, логично Commons оформить аннотацией Service, но компоненты в Spring по умолчанию являются Singletone, а мне надо чтобы для каждого случая использования Commons "подключался" свой Supplier.
    1. Можно сделать Commons не Singletone, a Prototype и в каждом экземпляре инициализировать свой Supplier.
    2. Можно оставить Singletone, а в каждый метод где надо создавать объекты передавать нужный Supplier (выглядит несколько громоздко).
    3. Можно не вводить Commons в контекст Spring (не помечать его аннотацией, а оставить обычным классом) и использовать обычным Java-способом - экземляр, инициализация, использование. Тут штука в том что помимо Supplier в Commons будут и другие зависимости, которые в случае со Spring внедряются самим спрингом и их достаточно просто указать. Без спринга их надо будет внедрять руками. Как бы не проблема, но зачем нам лишняя писанина? :)

    В общем, пока думаю как сделать лучше. Если есть типовой способ - подскажите :)
    Ответ написан
    Комментировать
  • Как исправить Exception in thread "main" java.util.NoSuchElementException?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    У тебя на разных данных разные ошибки :)
    Например, на 1, 2, 2, 2, 3 всё нормально.
    А на 1, 2, 3 будет ошибка в методе removeItem() т.к. ты передаёшь туда List нулевой длины и пытаешься получить его элемент.
    Ответ написан
    Комментировать
  • Как быстро нарисовать график?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Запрос java библиотека для построения графиков даёт в основном ссылки на библиотеку JFreeChart. Если это не совсем то что нужно, там же есть видео "JavaFX | Как построить графики функций?". Как подход - можно использовать, наверно и в Swing.
    Ответ написан
    Комментировать
  • Spring Boot Data JPA, как добавить логику при чтении объекта из базы?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    В общем, решил добавлением дополнительного сервисного класса, который берёт объекты из репозитория и преобразует как надо, а основная программа уже получает готовые объекты из него. Что есть правильно ибо преобразование - это уже бизнес-логика и не надо её мешать с DAO. Самое смищное что это и есть Спринг-Путь и это описано во всех учебниках. А я чёт затупил :) Ну, ничего: понимание ведёт к запоминанию, в следующий раз буду умнее :)
    Ответ написан
    Комментировать
  • Spring Boot Security, как настроить русский логин?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Решил проблему переводом конфига с application.properties на application.yml. Так кодировка человечья :)
    Ответ написан
    Комментировать
  • Spring и Firebird: как исправить предупреждения SQLState: null и not support non-zero timeouts?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Тэкс... С первым вопросом разобрался, оставлю здесь, вдруг кому пригодится. Решил понижением версии JDBC-драйвера до 2.2.15 (прописыванием соответствующей строки в pom.xml). Я так понял - старому серверу СУБД - старый драйвер :) Кстати, jar для java-1.8 нормально (по крайней мере пока) работает под java-17.

    Второй вопрос пока без ответа, там трюк с подсовыванием старого драйвера не сработал.....
    Ответ написан
    Комментировать
  • Какие лучшие курсы java 2021?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Для самых маленьких я бы посоветовал эти (бесплатные):
    https://stepik.org/course/6858
    https://stepik.org/course/6859
    https://stepik.org/course/6864
    https://stepik.org/course/6860
    Проходить именно в таком порядке. Короткая теория и масса задач - то что надо. На английском, но язык там очень простой. Проходить можно (нужно!) прямо в IDE Intellij IDEA.

    javarush.ru хорош, но платный, я бы его советовал после того как осилишь те,на степике - и дело пойдёт гораздо быстрее, и точно будешь понимать за что платишь.
    Ответ написан
    Комментировать
  • Автоматическое заполнение date в MySQL?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Присоединюсь к вопросу.
    С TIMESTAMP всё получилось. Но если нужно просто поле DATE, без времени, есть ли возможность автоматически вставлять текущую дату?
    Ответ написан
    Комментировать
  • Как понять что и как гуглить новичку при изучении программирования с нуля?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Книги - это хорошо, но потом. Программист с 7-летним опытом - это сильно потом!
    Я тоже хотел по книгам, но здесь мне посоветовали курс на stepik.org. И это очень правильный совет! В книгах есть упражнения, но это не то. Курс - это дозированная теория + МНОГО задач. Т.е. каждую тему ты рассматриваешь на практике многократно и с разных сторон. Твоё решение проверяется тестовой системой, ты можешь его обсудить с другими участниками в комментариях.
    Ты учишься разбирать задачи - от простых к более сложным. На курсе тебе дают далеко не всю теорию - много приходится искать самому и это тоже правильно.
    В итоге у тебя набита рука на:
    - понимание задачи;
    - составление алгоритма;
    - запись его в виде кода;
    - отладку программы - это крайне важно!
    - поиск необходимого в интернете;
    - использование IDE.
    После этого можно читать книги. Они заполнят пробелы: "Ого, я этим пользуюсь, а оказывается вот оно что!". Ты будешь понимать прочитанное т.к. многие вещи ты уже знаешь, а также знаешь как устроены вещи, которых ты ещё не знаешь.
    А программистом надо общаться уже потом - когда у тебя мозг перестроится и вы начнёте общаться на одном языке :)
    Ответ написан
  • Многоразрядный счётчик из цифр по любому основанию (Java), как сделать?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    В общем, от идеи полного перебора пришлось отказаться - считает слишком долго. Пробовал и с рекурсией, и с представлением BigInteger по основанию N (штатным и самодельным) - не дождаться :)

    Основную задачу решаю так. Допустим, N = 5. Тогда "максимальная" комбинация будет:
    0, 1, 2, 3, 4
    Все остальные будут получаться из неё выкидыванием элементов.
    Сначала выкидываем по одному, потом по два и т.д. Т.е. мне надо перебрать не сами элементы, а их позиции. Я сделал что-то вроде двоичной маски, в которой "1" - оставляем элемент, "0" - выкидываем. Например:

    0, 1, 2, 3, 4 - исходная комбинация
    0, 1, 0, 1, 0 - маска

    -, 1, -, 3, -> 1, 3 - результат

    Осталось пройти по всем вариантам маски, а это просто инкремент целого - и все комбинации получены! Тоже небыстро, но гораздо быстрее полного перебора! Если кто-то знает как ещё можно ускорить - поделитесь :)
    И да, собрать все комбинации в массив - тоже дохлая затея: память кончается очень быстро :) Приходится каждую комбинацию обрабатывать "на месте".

    котт:
    public class Part {
        public static void main(String[] args) {
            int numberOfThings = 41;
            long top = ((long) Math.pow(2, numberOfThings + 1));
            long bottom = ((long) Math.pow(2, numberOfThings)) + 1;
    
            int[] things = new int[numberOfThings];
            for (int i = 0; i < numberOfThings; i++) {
                things[i] = i;
            }
    
            while (bottom != top) {
                char[] mask = Long.toBinaryString(bottom++).toCharArray();
    
                List<Integer> comb = new ArrayList<>();
                for (int i = 0; i < numberOfThings; i++) {
                    if (mask[i + 1] == '1') comb.add(things[i]);
                }
    
                // Обработка комбинации
                System.out.println(comb);
            }
    
        }
    }
    Ответ написан
    Комментировать