JavaRush /Java Blog /Random-JA /コーヒーブレイク#133。Javaで配列の一部だけを取得する方法。Java のインターフェースと抽象クラス

コーヒーブレイク#133。Javaで配列の一部だけを取得する方法。Java のインターフェースと抽象クラス

Random-JA グループに公開済み

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配列ライブラリに便利な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 以降、Streams 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));
    }
上記のコードは配列の一部の値ベースのコピーですが、インデックスに基づいてコピーすることもできます。コードの下では、i=0 から Intstream をブロードキャストしています。i=len(配列)。通常、命令型コードでは、開始インデックスから終了インデックスまでのforループを作成し、各要素を反復処理します。Intstream を使用して同じことを実行し、インデックス要素にアクセスすることができます。
// 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を使用して配列の一部をコピーする 別の方法もあります。基本的にインデックスを提供し、それを 1 ずつインクリメントする getAndIncrementメソッドがあります。
// 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 言語を学習すると、必ずインターフェイスと呼ばれる概念に遭遇します。インターフェイスは Java の重要な機能の 1 つであるため、すべての開発者はインターフェイスの使用方法を知っておく必要があります。インターフェイスには利点と欠点の両方があることを覚えておくことが重要です。インターフェイスについてさらに深く理解しましょう。インターフェイスを実装するとき、抽象クラスに遭遇します。抽象クラスとは何ですか? それらは何のために必要なのでしょうか? インターフェースとは何ですか? どのように使用されますか? なぜインターフェースは抽象クラスを使用するのでしょうか? この記事では、これらすべての質問に対する答えが得られます。 コーヒーブレイク#133。 Javaで配列の一部だけを取得する方法。 Java のインターフェースと抽象クラス - 2

インターフェースとは何ですか?

インターフェイスは、動作を記述し、抽象化の実現に役立つ Java の特別なメカニズムです。静的定数と抽象メソッドがあるため、多くの点でクラスに似ています。インターフェイスには抽象メソッド (本体のないメソッド) のみを含めることができます。 インターフェイスと抽象クラスの簡単な違い:
  • インターフェイスにはメソッドが実装されておらず、すべてパブリックであり、クラス変数はありません。
  • 抽象クラスは、1 つ以上のメソッドが実装されていないクラスです。
Java 9 以降では、インターフェースでprivate メソッドdefault メソッド、およびstaticメソッドを使用することもできます。次に、抽象化を実現するために使用される単純なインターフェイス ロジックに移りましょう。

抽象化とは何ですか?

実際の例を見てみましょう。私たちは皆、携帯電話でアプリを使用しています。アプリケーションを使用したいときは、そのアプリケーションにアカウントを作成する必要があります。電話番号で登録すると、ワンタイムパスワードが携帯電話に送信されます。アプリケーションで「パスワードを取得」ボタンをクリックするとパスワードが受信されることはわかっていますが、このシステムがバックエンドでどのように動作するのか、ボタンをクリックした後に実際に何が起こるのかはわかりません。現在、バックエンドで実際に何が起こっているかをユーザーに示さずにタスクを正常に完了するプロセスは、抽象化として知られています。Java では、インターフェイスと抽象クラスを使用して抽象化を実現できます。

なぜインターフェースを使用するのでしょうか?

このインターフェイスを使用する理由は 3 つあります。
  • 抽象化を達成するため。
  • 多重継承機能をサポートするため。
  • 疎結合を実現します。

インターフェースの使い方は?

インターフェイスは、interfaceキーワードを使用して宣言されます。これは抽象化を提供します。つまり、クラスの構造を宣言します。インターフェイス内のすべてのメソッドは抽象メソッドであり、デフォルトで public、static、final に設定されます ( publicstaticfinal )。どのようなクラスがインターフェイスを実装する場合でも、そのインターフェイスで宣言されたすべてのメソッドを実装する必要があります。
interface <interface_name>{

     // declare constant fields
     // declare methods that abstract
     // by default.
 }
インターフェイスの抽象化と同様に、抽象クラスを使用して抽象化も実現できます。

抽象クラスとは何ですか?

抽象クラスは、先頭にabstractキーワードが付いているクラスです。これらには、抽象メソッドと具象メソッド (本体付き) の両方が含まれています。抽象クラスはインスタンス化できないため、拡張してメソッドを実装する必要があります。抽象クラスは、単なる動作ではなく、何らかの抽象オブジェクト (車、人など) を記述します。覚えて:
  • 抽象クラスは、 abstractキーワードを使用して宣言する必要があります。
  • 抽象メソッドと非抽象メソッドが存在する場合があります。
  • 抽象クラスのインスタンスは作成できません。
  • コンストラクターと静的メソッドを含めることができます。
  • サブクラスにメソッド本体を変更させないように強制する Final メソッドを含めることができます。
抽象メソッドを含む抽象クラスの例: この例では、 Bike は、実行される抽象メソッドを 1 つだけ含む抽象クラスです。その実装は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インターフェイスにはメソッドが 1 つだけあります。その実装は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 のクラスではサポートされていませんが、インターフェイスでは可能です。なぜですか? 継承に関するセクションですでに説明したように、このクラスの例では、あいまいさのため多重継承はサポートされていません。ただし、あいまいさがないため、インターフェイスの例ではサポートされています。その理由は、その実装が実装クラスによって提供されるためです。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION