Pascal4eg / Java

 Java | Фишки и трюки

SequencedCollection

В Java 21 появилась новая группа интерфейсов коллекций, самым основным из которых является SequencedCollection. Он расширяет базовый интерфейс Collection, добавляя в него ряд полезных методов для манипуляций с первым и последним элементами, а также для инвертирования коллекции:

...

Читать дальше

instanceof

public interface Shape { }
public class Triangle implements Shape { }
public class IsoscelesTriangle extends Triangle { } 

...

Shape shape = new Triangle();
Triangle triangle = new Triangle();
IsoscelesTriangle isoscelesTriangle = new IsoscelesTriangle();
Shape nonspecificShape = null;

assertTrue(shape instanceof Shape) ;
assertTrue(triangle instanceof Shape);
assertTrue(isoscelesTriangle instanceof Shape);
assertFalse(nonspecificShape instanceof Shape);

assertTrue(shape instanceof Triangle);
assertTrue(triangle instanceof Triangle);
assertTrue(isoscelesTriangle instanceof Triangle);
assertFalse(nonspecificShape instanceof Triangle);

assertFalse(shape instanceof IsoscelesTriangle);
assertFalse(triangle instanceof IsoscelesTriangle);
assertTrue(isoscelesTriangle instanceof IsoscelesTriangle);
assertFalse(nonspecificShape instanceof IsoscelesTriangle);

Ключевое слово instanceof — это бинарный оператор, и мы можем использовать его для проверки того, является ли определенный объект экземпляром заданного типа. Следовательно, результат операции либо истинен, либо ложен. Кроме того, ключевое слово instanceof — это наиболее распространенный и простой способ проверить, является ли объект подтипом другого типа.

...

Читать дальше

Является ли слово палиндромом

public class Palindrome {
    public static void main(String[] args) {
        String word = "шалаш";
        System.out.println(isPalindrome(word));
    }

    private static boolean isPalindrome(String word) {
        int count = word.length() / 2;
        int j = word.length() - 1;
        for (int i = 0; i < count; i++) {
            if (word.charAt(i) != word.charAt(j)) {
                return false;
            }
            j--;
        }
        return true;
    }
}

Суть алгоритма в том, что бы сравнивать поочередно первую букву с последней, вторую с предпоследней и так далее. Как только одна из пар не совпадет, сразу выходим - слово не палиндром.

...

Читать дальше

Метод equals()

public class User {
    public Integer id;
    public String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        return o instanceof User &&
                id != null &&
                id.equals(((User) o).id);
    }
}

Метод equals() используется для сравнения двух объектов на равенство. Он определен в классе Object и, по умолчанию, выполняет сравнение ссылок на объекты (то есть проверяет, являются ли объекты одним и тем же объектом в памяти). Многие классы переопределяют этот метод, чтобы сравнивать содержимое объектов, а не только ссылки.

...

Читать дальше

Объектно-ориентированное программирование (ООП)

Объектно-ориентированное программирование (ООП) - это парадигма программирования, которая базируется на концепции "объектов". Она предоставляет способ организации кода, который позволяет разрабатывать более модульные, масштабируемые и легко поддерживаемые программы. Основными концепциями ООП являются классы, объекты, инкапсуляция, наследование и полиморфизм. Вот более подробное описание этих концепций:

...

Читать дальше

JXPath

// без JXPath
Address address = null;
Collection locations = vendor.getLocations();
Iterator it = locations.iterator();
while (it.hasNext()) {
    Location location = (Location) it.next();
    String zipCode = location.getAddress().getZipCode();
    if (zipCode.equals("90210")) {
        address = location.getAddress();
        break;
    }
}

// c JXPath
Address address = (Address) JXPathContext.newContext(vendor).
        getValue( "locations[address/zipCode='90210']/address");

XPath (XML Path Language) — язык запросов к элементам XML-документа. Разработан для организации доступа к частям документа XML в файлах трансформации XSLT и является стандартом консорциума W3C. XPath призван реализовать навигацию по DOM в XML. В XPath используется компактный синтаксис, отличный от принятого в XML.

...

Читать дальше

Модули (Modules)

// module-info.java
module com.example.mymodule {
    requires other.module;
    exports com.example.mypackage;
}

Java 9 ввел важное изменение в структуру приложений — модульную систему Java (Java Platform Module System, JPMS). Эта система была внедрена для улучшения масштабируемости, обеспечения лучшей изоляции и повышения устойчивости приложений. Вот основные концепции модульной системы:

...

Читать дальше

Наследование конструкторов

public class SuperClass {
    public SuperClass(int value) {
        // инициализация суперкласса
    }
}
        
class SubClass extends SuperClass {
    public SubClass(int value) {
        super (value); // вызываем конструктор суперкласса
        // инициализация подкласса
    }
}

В Java конструкторы не наследуются в том смысле, в котором наследуются методы и поля. Конструкторы - это специальные методы, используемые для инициализации объектов класса, и они не наследуются автоматически от суперкласса.

...

Читать дальше

for-each для собственного класса

import java.util.Iterator;
import java.util.List;

public class IterableExample {
    public static void main (String[] args) {
        Row row = new Row(List.of(new Cell("text1"), new Cell("text2"), new Cell("text3")));
        for (Cell cell : row) {
            System.out.println(cell.text);
        }
    }

    static class Row implements Iterable<Cell> {
        private List<Cell> cells;

        public Row(List<Cell> cells) {
            this.cells = cells;
        }

        @Override
        public Iterator<Cell> iterator() {
            // в данном случаем можно было просто отдать cells.iterator();
            return new Iterator<>() {
                private int index = 0;

                @Override
                public boolean hasNext() {
                    return index < cells.size();
                }

                @Override
                public Cell next() {
                    return cells.get(index++);
                }
            };
        }
    }

    static class Cell {
        String text;
        public Cell(String text) {
            this.text = text;
        }
    }
}

В Java цикл for-each позволяет перебирать элементы массивов, коллекций и других итерируемых объектов без необходимости использовать индексы или итераторы. Однако, для того чтобы вы могли использовать for-each для перебора элементов своего собственного класса, этот класс должен реализовать интерфейс Iterable и предоставить метод iterator(), возвращающий объект, реализующий интерфейс Iterator.

...

Читать дальше

Scanner

import java.util.Scanner;

public class ScannerExample {
    public static void main (String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("Введите целое число: ");
        int number = scanner.nextInt();
        System.out.println("Вы ввели: " + number);
        
        // Не забывайте закрывать Scanner после использования.
        scanner.close();
    }
}

Класс Scanner представляет собой инструмент для считывания данных из различных источников, таких как стандартный ввод (клавиатура), файлы и строки. Он является частью пакета java.util и используется для обработки ввода данных в приложениях.

...

Читать дальше