JavaRush/Java блог/Random UA/Кава-брейк #133. Як отримати тільки частину масиву Java. ...

Кава-брейк #133. Як отримати тільки частину масиву Java. Інтерфейси та абстрактні класи в Java

Стаття з групи Random UA
учасників

Як отримати тільки частину масиву в Java

Джерело: Asyncq Копіювання частини масиву - дуже поширена операція, з якою стикається кожен розробник. У цій статті ми побачимо традиційний імперативний стиль та сучасний код декларативного стилю з лямбда-виразом та потоковим API. Кава-брейк #133.  Як отримати тільки частину масиву Java.  Інтерфейси та абстрактні класи в Java - 1

Імперативний підхід

Імперативний стиль програмування давно поширений Java. Тому для Java-розробників природно писати наведений нижче код для копіювання певної частини вихідного масиву. Для цього досить просто перебрати елементи, відфільтровуючи тільки ті, які необхідні, і записати їх в остаточний масив.
private static int[] copyArray(){
       int[] numbers = {1,2,3,4,5,6,7};
       int[] subArray = new int[numbers.length-3];
       int j =3;
       for (int i=0;i<subArray.length;i++){
           subArray[i] = numbers[j+i];
       }
       System.out.println(Arrays.toString(subArray));
       return subArray;
   }
Багато хто з нас часто забуває, що в Java-бібліотеці Arrays є зручний метод copyOfRange . Цей метод можна використовувати для копіювання частини масиву шляхом передачі в індекс та з нього.
private static int[] copyArray1(){
  int[] numbers = {1,2,3,4,5,6,7};
  int[] subArray = Arrays.copyOfRange(numbers,3,numbers.length);
  System.out.println(Arrays.toString(subArray));
  return subArray;
}

Декларативний підхід

Починаючи з Java 8, ми можемо використовувати API потоків для копіювання частини масиву. У наведеному нижче коді ми можемо передавати int[] і відфільтровувати тільки значення, що перевищують 3, і, нарешті, копіювати їх масив.
private static void copyArray2(){
        int[] numbers = {1,2,3,4,5,6,7};
        // copy with values
        int[] subArray = Arrays.stream(numbers).filter(a-> a>3).toArray();
        System.out.println(Arrays.toString(subArray));
    }
Наведений вище код є копією частини масиву на основі значень, але ми можемо також копіювати на основі індексу. Нижче за код ми транслюємо Intstream from i=0; i = len (array) . Зазвичай, у імперативному коді ми пишемо цикл for від початкового індексу до кінцевого індексу і перебираємо кожен елемент. Аналогічно ми можемо зробити за допомогою Intstream і отримати доступ до елемента index .
// copy with index
int[] subArray1 = IntStream
                .range(0, numbers.length)
                .filter(i -> i > 3)
                .map(a->numbers[a]).toArray();

System.out.println(Arrays.toString(subArray1));
Хоча описаний вище метод працює, ми маємо інший спосіб, в якому ми можемо використовувати AtomicInteger для копіювання частини масиву. Він має метод getAndIncrement , який по суті надає індекс і збільшує його на 1.
// copy with index
AtomicInteger atomicInteger = new AtomicInteger();
int[] subArray2 = Arrays.stream(numbers).filter(i -> atomicInteger.getAndIncrement() > 3).toArray();
System.out.println(Arrays.toString(subArray2));

Висновок

У цій статті ми обговорабо, як можна скопіювати частину масиву Java, використовуючи імперативний та декларативний стилі. Я хотів би працювати в декларативному стилі, тому що він робить мій код більш читабельним і менш докладним.

Інтерфейси та абстрактні класи в Java

Джерело: Devgenius Під час вивчення мови Java ми неодмінно стикаємося з концепцією під назвою Interfaces. Інтерфейси - одна з ключових особливостей Java, тому кожен розробник повинен знати, як їх використовувати. Важливо пам'ятати, що інтерфейси мають як свої переваги, так і недоліки. Давайте заглибимося в розуміння інтерфейсів. Під час реалізації інтерфейсів ми стикаємося з абстрактними класами. Що таке абстрактні класи? Навіщо вони потрібні? Що таке інтерфейс? Як вони використовуються? Чому в інтерфейсах використовуються абстрактні класи? Відповіді на всі ці запитання ви отримаєте у цій статті. Кава-брейк #133.  Як отримати тільки частину масиву Java.  Інтерфейси та абстрактні класи в Java - 2

Що таке інтерфейс?

Інтерфейс - це особливий механізм Java, який описує поведінку і допомагає досягти абстракції. Він багато в чому схожий на клас, тому що має статичні константи та абстрактні методи. Інтерфейси можуть мати лише абстрактні методи (методи без тіла). Коротка різниця між інтерфейсом та абстрактним класом:
  • У інтерфейсу жоден спосіб не реалізований, всі вони громадські і немає змінних класу.
  • Абстрактний клас - це клас, у якого не реалізовано один або більше методів.
Починаючи з Java 9 ми також можемо використовувати в інтерфейсах методи private , default та static . А тепер перейдемо до простої логіки інтерфейсу, яка використовується для досягнення абстракції.

Що таке абстракція?

Давайте візьмемо приклад із реального життя. Ми всі використовуємо програми на мобільних телефонах. Щоразу, коли ми хочемо використовувати будь-яку програму, ми повинні створити в ньому обліковий запис. Коли ми реєструємось через свій номер телефону, на наш мобільний надходить одноразовий пароль. Ми знаємо, що пароль надходить після натискання кнопки “Отримати пароль” у додатку, але ми не знаємо, як ця система працює в бекенді і що насправді відбувається після натискання кнопки. Отже, процес успішного виконання завдань без відображення користувачеві того, що насправді відбувається в бекенді, відомий як абстракція. У Java ми можемо досягти абстракції, використовуючи інтерфейси та абстрактні класи.

Навіщо використовувати інтерфейс?

Існує три причини для використання інтерфейсу:
  • Для досягнення абстракції.
  • Для підтримки функціональності множинного успадкування.
  • Досягнення слабкої пов'язаності (loose coupling).

Як користуватись інтерфейсом?

Інтерфейс оголошується за допомогою ключового слова interface . Він забезпечує абстракцію, тобто оголошує структуру класу. Всі методи в інтерфейсі є абстрактними і за умовчанням встановлюються як загальнодоступні, статичні та остаточні ( public , static , final ). Хоч би який клас реалізовував інтерфейс, він повинен реалізовувати всі методи, оголошені в інтерфейсі.
interface <interface_name>{

     // declare constant fields
     // declare methods that abstract
     // by default.
 }
Подібно до абстракції інтерфейсів, абстракція також може бути досягнута з використанням абстрактних класів.

Що таке абстрактні класи?

Абстрактні класи є класи з ключовим словом abstract перед ними. Вони містять як абстрактні, і конкретні методи (з тілом). Абстрактні класи не можуть бути створені, вони мають бути розширені, а їх методи мають бути реалізовані. Абстрактний клас описує абстрактний об'єкт (автомобіль, людини і так далі), а не тільки поведінка. Запам'ятайте:
  • Абстрактний клас повинен бути оголошений із ключовим словом abstract .
  • Можуть бути абстрактні та неабстрактні методи.
  • Екземпляр абстрактного класу не можна створити.
  • Він може мати конструктори та статичні методи.
  • Він може мати методи final, які змусять підклас не змінювати тіло методу.
Приклад абстрактного класу з абстрактним методом: У цьому прикладі Bike – це абстрактний клас, який містить лише один запуск абстрактного методу. Його реалізація забезпечується класом Honda .
abstract class Bike{
  abstract void run();
}
class Honda4 extends Bike{
void run(){System.out.println("running safely");}
public static void main(String args[]){
 Bike obj = new Honda4();
 obj.run();
}
}
Абстрактний клас, що має конструктор, елемент даних та методи: Абстрактний клас може мати елемент даних, абстрактний метод, тіло методу (неабстрактний метод), конструктор і навіть метод main() .
//Example of an abstract class that has abstract and non-abstract methods
 abstract class Bike{
   Bike(){System.out.println("bike is created");}
   abstract void run();
   void changeGear(){System.out.println("gear changed");}
 }
//Creating a Child class which inherits Abstract class
 class Honda extends Bike{
 void run(){System.out.println("running safely..");}
 }
//Creating a Test class which calls abstract and non-abstract methods
 class TestAbstraction2{
 public static void main(String args[]){
  Bike obj = new Honda();
  obj.run();
  obj.changeGear();
}
}
Тепер постає головне питання. Якщо інтерфейси та абстрактні класи допомагають в абстракції, то що з них краще використовувати? Відповідь у тому, що Java не підтримує множинне успадкування, як це робить C++. Тобто якщо нам потрібно досягти множинного успадкування, тоді варто використовувати інтерфейси. Тобто абстрактні класи допомагають від 1 до 100% випадків, а інтерфейси допомагають у 100% випадків. Якщо нам потрібна поведінка, необхідно використовувати інтерфейс. Якщо йдеться про концептуальний об'єкт — ми маємо використати абстрактний клас.

Приклад інтерфейсу Java

У цьому прикладі інтерфейс Drawable має лише один метод. Його реалізація забезпечується класами Rectangle та Circle . У реальному сценарії інтерфейс визначається кимось іншим, яке реалізація надається різними постачальниками реалізації. Більше того, він використовується ще кимось. Частина реалізації прихована користувачем, який використовує інтерфейс.
//Interface declaration: by first user
interface Drawable{
void draw();
}
//Implementation: by second user
class Rectangle implements Drawable{
public void draw(){System.out.println("drawing rectangle");}
}
class Circle implements Drawable{
public void draw(){System.out.println("drawing circle");}
}
//Using interface: by third user
class TestInterface1{
public static void main(String args[]){
Drawable d=new Circle();//In real scenario, object is provided by method e.g. getDrawable()
d.draw();
}}

Множинне успадкування в Java за допомогою інтерфейсу

Якщо клас реалізує кілька інтерфейсів або розширює інтерфейсів, це називається множинним успадкуванням.
interface Printable{
void print();
}
interface Showable{
void show();
}
class A7 implements Printable,Showable{
public void print(){System.out.println("Hello");}
public void show(){System.out.println("Welcome");}

public static void main(String args[]){
A7 obj = new A7();
obj.print();
obj.show();
 }
}
Питання: Множинне успадкування не підтримується через клас Java, але можливо через інтерфейс, чому? Як уже пояснювалося у розділі про спадкування, множинне спадкування не підтримується на прикладі класу через неоднозначність. Однак він підтримується на прикладі інтерфейсу, оскільки в ньому немає неоднозначності. Причина у цьому, що його реалізація забезпечується класом реалізації.
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.