JavaでカスタムIterable(イテラブル)を実装する方法をわかりやすく解説
Iterableインターフェースはjava.langパッケージに定義されており、Java 5から導入されました。このインターフェースを実装したオブジェクトは、「拡張for文(for-each文)」の対象として扱うことができます。for-eachループは、配列やコレクションを反復処理するための便利な構文です。さらに、Iterableインターフェースを自ら実装することで、独自の反復動作を持つカスタムイテラブルを作成することも可能です。
構文
public interface Iterable<T>
実装例
以下の例では、Personクラスのオブジェクトを管理するPersonArrayListクラスを作成し、Iterable<Person>インターフェースを実装しています。iterator()メソッドをオーバーライドすることで、このカスタムコレクションをfor-each文で直接反復処理できるようになります。
import static java.lang.String.format;
import java.util.*;
// Personクラス
class Person {
private String firstName, lastName;
private int age;
public Person() { }
public Person(String firstName, String lastName, int age) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return format("First Name:\t%s\tLast Name:\t%s\tAge:\t%d", firstName, lastName, age);
}
}
// PersonArrayListクラス
public class PersonArrayList implements Iterable<Person> {
private List<Person> persons;
private static final int MIN_AGE = 10;
public PersonArrayList() {
persons = new ArrayList<>(MIN_AGE);
}
public PersonArrayList(int age) {
persons = new ArrayList<>(age);
}
public void addPerson(Person p) {
persons.add(p);
}
public void removePerson(Person p) {
persons.remove(p);
}
public int size() {
return persons.size();
}
@Override
public Iterator<Person> iterator() {
return persons.iterator();
}
public static void main(String[] args) {
Person p1 = new Person("Adithya", "Sai", 20);
Person p2 = new Person("Jai", "Dev", 30);
PersonArrayList pList = new PersonArrayList();
pList.addPerson(p1);
pList.addPerson(p2);
for (Person person : pList) {
System.out.println(person);
}
}
}
コードのポイント
PersonArrayListクラスはIterable<Person>を実装し、内部にList<Person>としてPersonオブジェクトを保持します。iterator()メソッドをオーバーライドして内部リストのイテレータを返すことで、拡張for文が利用可能になります。- mainメソッドでは
for (Person person : pList)のように、自作コレクションを標準のコレクションと同じ感覚で反復処理できます。
実行結果
First Name: Adithya Last Name: Sai Age: 20 First Name: Jai Last Name: Dev Age: 30
-
【Java入門】JScrollPaneでスクロール可能なJPanelを実装する方法
JPanelとはJPanelはSwingで最もよく使われるコンテナの一つです。まずは基本的な特徴を確認しておきましょう。JPanelはJComponentのサブクラスであり、JComponentはContainerクラスのサブクラスです。したがって、JPanel自体もContainer(コンテナ)として扱えます。JPanelは、他のコンポーネントやパネルを配置するための「空の領域」として利用できます。テキストフィールド、ラベル、ボタン、チェックボックス、画像など、さまざまなコンポーネントを自由に追加できます。FlowLayout、GridLayout、BorderLayoutなどのレイアウトマ
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー