Ответы пользователя по тегу Java
  • Почему JdbcTemplate не выполняет query с параметрами?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Нужен вообще другой темплейт, JDBC так не умеет.

    https://www.javatpoint.com/spring-NamedParameterJd...

    jdbcTemplate.execute(" CREATE TABLE test (id BIGINT PRIMARY KEY, test_id VARCHAR(50));");
            Map<String, String> parameters = new HashMap();
            parameters.put("test_id", "test");
            jdbcTemplate2.execute(
                    "INSERT INTO test (id, test_id) VALUES (1, :test_id)",
                    parameters,
                    (PreparedStatementCallback) PreparedStatement::executeUpdate
            );
    Ответ написан
    Комментировать
  • Как сделать двойной join в criteria api?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    решил.

    Сначала джойню A <- B, поотом B <- C

    // Join and predicate ontSerialNumber from Subscriber NeProfile 
                Optional.ofNullable(requestAssuranceAccessLine.getOntSerialNumber()).ifPresent(ontSerialNumber -> {
                            Join<DefaultNeProfile, AccessLine> joinedDefaultNeProfile = root.join("defaultNeProfile");
                            Join<SubscriberNeProfile, DefaultNeProfile> joinedSubscriberNeProfile = joinedDefaultNeProfile.join("subscriberNeProfile");
                            predicates.add(criteriaBuilder.equal(joinedSubscriberNeProfile.get("ontSerialNumber"), ontSerialNumber));
                        }
                );
    Ответ написан
    Комментировать
  • Как наконец попасть на собеседование Java junior разработчика?

    SlandShow
    @SlandShow
    70% of my body is made of movies.
    Мне кажется, что Вам надо немного поучить веб-фреймворки: node.js, react, angular и тд. Ну и помимо всего, раз знаете спринг и сервлеты, то лучше подтянуть SQL (не увидел у вас конкретно него).

    И не забывайте про то, что может сейчас Вам не очень везёт с работой, но нужная компания в итоге пригласит Вас к себе.

    P.S: для хантера было бы неплохо прикрепить линки на деплойт ваших работ, если такое имеет место быть.
    Ответ написан
    2 комментария
  • Как мне реализовать передачу сообщений между Tomcat и WildFly через JMS?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    RabbitMQ
    Ответ написан
    Комментировать
  • Почему среда пишет, что у меня нету маппинга сервлета?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Разобрался.

    Project Structure -> Modules -> Добавить дескриптор развёртывания web.xml

    https://stackoverflow.com/questions/43153904/servl...
    Ответ написан
    Комментировать
  • Никак не могу настроить порты WildFly. Что делать?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Поставил кастомные настройки и поменял порт 8080 на 8181. Он был занят томкатом - потому и ругался
    Ответ написан
    Комментировать
  • Как исправить неправильный JAVA_PATH?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Разобрался.

    JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
    export PATH=$JAVA_HOME/bin:$PATH
    Ответ написан
    Комментировать
  • Почему stack оказывается пустым?

    SlandShow
    @SlandShow Автор вопроса
    70% of my body is made of movies.
    Ошибка была в неправильном парсинге постфиксной нотации. У меня сначала была проверка на то, что итерируемый элемент - число, а стоило мне поменять местами эти проверки (сначала проверяю итерируемый элемент на оператор) - всё заработало.

    Вот незначительная правка кода:
    private void parse() {
            String currentElement = "";
            String[] elements = regular.split(" ");
            double number1, number2, interAns;
    
            for (int i = 0; i < elements.length; i++) {
                currentElement = elements[i];
    
                // Check if current element is operator
              	if (isOperator(currentElement)) {
                  	if (stack.size() > 1 && !currentElement.equals("")) {
                      	 number2 = stack.pop();
                       	 number1 = stack.pop();
    
                       	 // Make calculations
                       	 if (currentElement.equals("+"))
                            interAns = number1 + number2;
                       	 else if (currentElement.equals("-"))
                            interAns = number1 - number2;
                      	 else if (currentElement.equals("*"))
                            interAns = number1 * number2;
                       	 else if (currentElement.equals("/"))
                            interAns = number1 / number2;
                       	 else interAns = 0;
    
                        stack.push(interAns);
                    }
                } else {
                  	try {
                   		double element = Double.parseDouble(currentElement);
                    	stack.push(element);
                    } catch (NumberFormatException e) {
                      	System.out.println("Hmm...");
                    }
                }
              
              
              /*
                try {
                    double element = Double.parseDouble(currentElement);
                    stack.push(element);
                } catch (NumberFormatException e) {
                    if (!currentElement.equals("")) {
                        number2 = stack.pop();
                        number1 = stack.pop();
    
                        // Make calculations
                        if (currentElement.equals("+"))
                            interAns = number1 + number2;
                        else if (currentElement.equals("-"))
                            interAns = number1 - number2;
                        else if (currentElement.equals("*"))
                            interAns = number1 * number2;
                        else if (currentElement.equals("/"))
                            interAns = number1 / number2;
                        else interAns = 0;
    
                        stack.push(interAns);
                    }
                }*/
            }
            interAns = stack.pop();
            result = interAns;
        }
    
    // Новая функция
    private boolean isOperator(String s) {
            return s.equals("+")|| s.equals("-") || s.equals("*") || s.equals("/");
    }


    Раньше мой код не мог парсить вот такие выражения: infix: 12 - 5 * 2 + 16 / 4 - 50 / 10 (postfix is 12 5 2 * - 16 4 / + 50 10 / -) - не совсем понимаю почему, но стоило мне поменять местами сравнения, так всё сразу заработало!

    5a2919e977bb5940625141.png

    Ну и ещё стоит отметить то, как отметил Денис Загаевский , что надо добавить доп.проверку на пустоту стека ( if (stack.size() > 1) ...).
    Ответ написан
    Комментировать
  • Как сделать переключающуюся панель?

    SlandShow
    @SlandShow
    70% of my body is made of movies.
    Тут есть один туториал.

    Но как мне кажется, если Вы хотите сделать по настоящему хороший калькулятор, то лучше делать его на основе обратной польской записи, чтобы можно было считать сложные выражения типа:

    1 + 2*3
    (2 - 4) / 5
    9/2 - 3/4
    Ответ написан
    Комментировать
  • Почему информация о типе сохраняется, несмотря на стирание типов?

    SlandShow
    @SlandShow
    70% of my body is made of movies.
    Сначала может показаться, что JVM создает новую версию класса где и заменяет Т на нужный тип. Но на самом деле, JVM частично 'подправляет' уже имеющийся параметризованный класс. В том числе заменяет Т на версию нужного значения каждый раз, когда это требуется. Т.е класс существует один, а не несколько версий с полями разных типов.

    В вашем же случае сначала JVM подправляет T obj на Object obj (который преобразуется нисходящим преобразованием в String) а потом снова подправляет String obj на Object obj (который потом так-же преобразуется в Integer неявно)

    g.set("String");
    f.set(123);



    T obj на самом деле заменяется на Object obj. Этот процесс называется стиранием, который происходит на стадии компиляции. А затем неявно происходит нисходящее преобразование.
    class Test<T> {
    T val; // на самом деле T заменяется на Object
    Test(T o) { val = o; }
    T get() { return val; }
    
    }
    
    class SimpleClass {
    void info() { System.out.println("я метод info() из класса SimpleClass"); }
    }
    
    Test<SimpleClass> v = new Test<>(new SimpleClass());
    
    SimpleClass v2 = v.get(); // при инициализации v2 на самом деле происходит неявное нисходящее преобразование к нужному типу
    
    //что происходит на самом деле:
    //SimpleClass v2 = (SimpleClass) v.get();
    
    v2.info();


    Стирание генерализированных типов происходит на стадии компиляции. В самом простом случае ничем не ограниченный тип стирается до Object`а, обобщенный класс NameClass до NameClass.

    Другими словами информация о дженериках существует только на этапе компиляции и недоступна в runtime.

    Ответ написан
    3 комментария