Ответы пользователя по тегу Java
  • Как иерархические данные из таблицы преобразовать в объекты Java?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Наверно как-то так:
    - делаем выборку всех ID в List;
    - заводим пустой List;
    - проходим по списку ID обязательно итератором;
    - рекурсивно достаём элементы, начиная с текущего ID, условия окончания рекурсии - parentId == null . Те элементы, которые достали - удаляем из списка ID (поэтому нужен итератор, а не простой цикл).
    Ответ написан
    Комментировать
  • В каком порядке и что учить в джаве?

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

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Потому что способ получения данных может меняться. Например, сегодня ты получаешь данные напрямую из БД, а завтра она уедет на отдельный сервер и тебе будет предоставлен только какой-нить GraphQL. Ты перепишешь только свой класс доступа к данным, но так чтобы он реализовывал уже существующий интерфейс. Тогда весь остальной проект править не придётся.
    Интерфейсы обеспечивают контракт - правила, по которым части приложения обмениваются данными между собой.
    Благодаря этому, возможно на этапе планирования проекта "нарезать" приложение на интерфейсы, а потом раздать разработчикам задания на реализацию той или иной части. За счёт строгого контракта, повышается вероятность того что получившиеся части соберутся и заработают вместе :)

    Что касается ресурсов, если "для самых маленьких", то:
    - видео Наиля Алишева - объясняет подробно и понятно;
    - курс Заура Трегулова, есть на Udemi, промокод у него на ютубе. Если нет возможности оплатить Udemi, он же есть на Stepik. Курс платный, но "по цене шаурмы";
    - видео на каналах Евгения Сулейманова и LetsCode, там есть примеры создания проекта с нуля, можно познакомиться "как это вообще делается";
    - можно почитать лекции здесь.
    Ответ написан
    Комментировать
  • Как из Flux собрать массив JSON?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Если кому интересно, придумал такой костыль:
    Flux<String> items = ... здесь исходный Flux ... ;
    Flux<Integer> numbers = Flux.generate(
      () -> 0,
      (state, sink) -> {
        sink.next(state);
        return state + 1;
      }
    );
    
    items.zipWith(numbers, (i,n) -> n + i)
      .map(item-> item.replace("0{", "{").replaceFirst("^[0-9]+", ", "))
      .startWith("[")
      .concatWithValues("]")
      .subscribe(System.out::println);


    Т.е. мы сначала к каждой строке пририсовываем последовательный номер. Потом первый номер (0) просто затираем, а остальные меняем на запятую. Ну и потом оборачиваем всё квадратными скобками.
    Не знаю насколько это хорошо, но работает :)
    Ответ написан
    Комментировать
  • Как в Reactor запускать параллельные запросы?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Нашёл аналогичный вопрос :)

    Кому интересно, решение:

    public class Test {
    
      static Mono<String> getFromHttp() {
        return Mono.just("from HTTP").delayElement(Duration.ofSeconds(2));
      }
    
      static Mono<String> getFromDb() {
        return Mono.just("from DB").delayElement(Duration.ofSeconds(1));
      }
    
      public static void main(String[] args) {
    
        String fromHttp = "---";
        String fromDb = "===";
    
        long start = System.currentTimeMillis();
    
        Mono<String> httpReq = getFromHttp();
        Mono<String> dbReq = getFromDb();
    
        Tuple2<String, String> values = Mono.zip(httpReq, dbReq).block();
        fromHttp = values.getT1();
        fromDb = values.getT2();
    
        System.out.println(System.currentTimeMillis() - start);
        System.out.println(fromHttp);
        System.out.println(fromDb);
      }
      
    }
    Ответ написан
    Комментировать
  • Java. Ссылка Класс::МетодЭкземпляра. Как реализовать метод?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Вроде как и с нестатическими получается:
    public class Test {
    
      public static void main(String[] args) {
        
        MyClass myClass = new MyClass();
    
        Stream.generate(ToProcess::new).limit(10).map(myClass::process);
        
      }
      
    }
    
    
    class MyClass{
      ToProcess process(ToProcess obj){
        // processing
        return obj;
      }
    }
    
    
    class ToProcess {
    }

    По крайней мере, IDE-шка ошибок не даёт :)
    Ответ написан
    3 комментария
  • Как тестировать работу Service класса с базой данных или как сравнить два JPA entity объекта в тестах?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Когда ты реализуешь equals() и hashCode(), логику этих методов ты определяешь сам, тебе не обязательно сравнивать все поля. Сравнивать то что тебе надо и так как надо - хоть фазу Луны со спином ретроградного Меркурия.
    Ответ написан
    Комментировать
  • Какие виды и специализации Java программистов бывают?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Основные направления тебе перечислили, немного дополню.
    - есть очень сложный и очень старый энтерпрайз, например, банки. Бывают написаны на очень старой Java, говорят, даже 5 встречается :) Охренеть какая сложная предметная область. Тебе могут дать задание написать или исправить класс, а ты вообще в душе не шаришь что это и зачем. И так всю жизнь :)
    - есть системы типа SAP, которые надо не писать, а адаптировать под конкретного заказчика типа Аэрофлота. Делается это путём прописывания логики работы уже готовой системы, а также написания своих плагинов, в т.ч. на Java.

    Ну а если тебе нужен универсальный совет, то вот он:
    - не знаешь что учить - учи Spring, вакансии не дадут соврать;
    - обязательно познакомься с SQL - чтобы понимать не только JPA, но и "голые" запросы и уметь хотя бы немного в их оптимизацию;
    - познакомься с фронтендом на базе фреймворка, самый популярный React, хотя бэкендерам лучше заходит Angular. Это позволит на практике понять как происходит взаимодействие бэк-фронт, ну и вообще - расширит сознание :)

    С таким стэком и (желательно) домашним проектом искать работу будет легче и веселее :)
    Удачи!
    Ответ написан
    1 комментарий
  • Что делать, если я захожу на майнкрафт сервер и мне выдает эту ошибку?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Что с этим делать?

    Прекратить играться и заняться наконец каким-то полезным делом.
    Ответ написан
    Комментировать
  • Как в Reactor Netty отправить файл?

    @Wan-Derer Автор вопроса
    Зобанели на Хабре, волки́ ;((
    Оставлю таблетку для памяти :) Так работает:

    // GET /api/reports/download/{id}
    public Publisher<Void> download(HttpServerRequest req, HttpServerResponse resp) {
    
      try {
        String filePath = reportService.getFilePath(Integer.parseInt(req.param("id")));
    
        if (filePath == null) return resp.status(HttpResponseStatus.NOT_FOUND);
    
        Path file = Path.of(filePath);
        String filename =
          URLEncoder.encode(file.getFileName().toString(), StandardCharsets.UTF_8).replace("+", "%20");
    
        return resp
          .status(HttpResponseStatus.OK)
          .addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*")     // CORS
          .addHeader(ACCESS_CONTROL_EXPOSE_HEADERS, "filename")
          .addHeader("filename", filename)
          .addHeader(CONTENT_TYPE, "application/octet-stream")
          .sendFileChunked(file, 0, file.toFile().length())     // or Files.size(file) ??
          ;
    
      } catch (Exception e) {
        return getErrorResponse(resp, e);
      }
    }
    Ответ написан
    Комментировать
  • Как перекодировать строки из windows 1251 в читаемый вид в java?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Так получилось :)
    String a = new String("Øêàô ðàñïðåäåëèòåëüíûé îáðàçåö".getBytes("Windows-1252"), "Windows-1251");
    Ответ написан
    Комментировать
  • Как парсить imap4rev1, FETCH Response, message data?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Я делал приём писем на обычном клиенте: https://jakarta.ee/specifications/mail/2.0/jakarta...
    Вроде, не так сложно получилось :)
    Почему-то оказалось что фреймворки не любят приём писем, в них в основном только отправка, пришлось делать руками :)
    Ответ написан
    2 комментария
  • Как сделать только допустимые символы в переменную?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Например, регуляркой:
    String a = "123-qwe-абв";
    
    String b = a.replaceAll("[^A-Za-z0-9]", "");
    
    System.out.println(a);
    System.out.println(b);
    Ответ написан
    Комментировать
  • Почему лямбда не работает, хотя версия джавы должна это позволять?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Поставь Language Level "соответствующий SDK".
    На вкладке Modules тоже проверь.
    В Settings - Build, Execution... - Java Compiler тоже.
    Ну и настройках сборщика.
    Ответ написан
    Комментировать
  • Почему в Kotlin (а может и в Java) так много методов?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    часть методов появляется из-за строгой типизации: для разных типов приходится писать разные методы

    Нет. В Java каждый объект имеет конкретный тип, поэтому у него не может быть методов для разных типов :)
    String - тип очень распространённый, с ним много работы, поэтому в Java сочли необходимым прикрутить к нему ряд методов, максимально их оптимизировав. И я бы не сказал что их много. М.б. так кажется глядя на список, выдаваемый IDE, но там много перегруженных методов: с одинаковым именем, но с разными аргументами. Плюс есть статические методы у класса String. Плюс есть специальные классы StringBuilder/StringBuffer, там есть свои методы, видимо, народ просил :)
    То же относится к массивам - всё ради скорости!
    В Котлин же всё свалили в кучу, в т.ч. то что в Java делается циклами или через Stream API, поэтому кажется что методов до фига много. На самом деле, это просто "синтаксический сахар", когда в одно действие сводится несколько.
    Просто считай что Java "более низкоуровневая" чем Питон. Пользуйся теми методами что тебе нужны здесь и сейчас. Остальные пригодятся со временем.
    Ответ написан
    Комментировать
  • Как можно перевести результаты запроса в POJO в JPA?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    По-моему, тут либо с Entity, либо без JPA :)
    Ответ написан
    Комментировать
  • Как объединить 2 списка стримом так, чтобы итоговый результат включал в себя одни параметры из первого списка, а другие из второго списка?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    М.б. так?
    import lombok.Getter;
    import lombok.Setter;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class test {
    
      public static void main(String[] args) {
        List<Item> listA = new ArrayList<>();
        List<Item> listB = new ArrayList<>();
    
        List<Item> coupled = couple(listA, listB);
    
      }
    
      static List<Item> couple(List<Item> listA, List<Item> listB){
        return listA.stream()
          .peek(itemA -> {
            Item complimentary = listB.stream().filter(itemB -> itemB.getId() == itemA.getId()).findFirst().orElse(null);
            if (complimentary == null) throw new IllegalArgumentException("Can't find pair");
            itemA.setLow(complimentary.getLow());
          })
          .toList();
      }
    }
    
    
    @Getter
    @Setter
    class Item{
      private int id;
      private int low;
      private int high;
    }


    НО! Если элементов много то быстродействие будет ни к чёрту :)
    Ответ написан
    Комментировать
  • Как добавить в feign client url из .properties?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Не очень понятно: проект на Spring? Если да, то:
    1. Прочитать файл. Сделать MAP, выгрузить его в контекст через @ Bean. Если без Spring, то то же самое, но вместо бина сделать синглтон и к нему обращаться, получится что-то вроде глобальных констант.
    2. Сделать application.properties (по-моему, они могут работать параллельно с .YML, но это надо проверить) и подключить туда другие .properties. @ Value будет работать.
    Ответ написан
  • Как правильно построить бесконечное соединение?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Могу предположить что речь идёт о сокетах.
    Ответ написан
    Комментировать
  • Как сделать маппинг если используется три таблицы?

    @Wan-Derer
    Зобанели на Хабре, волки́ ;((
    Вроде как, связывание через третью таблицу используется только для варианта many-to-many
    https://www.baeldung.com/jpa-many-to-many
    Ответ написан
    2 комментария