简体   繁体   中英

Creating my own enhanced for loop

If I were to create my own data type in Java, I was wondering how I'd do it to make it "enhanced for loop compatible" if possible. For example:

System.out.println(object); //This implicitly calls the object's toString() method

Now, if I wanted to do a enhanced for loop with my own data type, how would I do it?

MyList<String> list = new MyList<>();
for(String s : list)
    System.out.println(s);

Is there a way to make my data type be recognized as an array so I could just pop it into a for loop as so? Do I extend some class? I'd rather not extend a premade class such as ArrayList or List, but maybe there's some other class like Comparable< T >

Thank you.

Is there a way to make my data type be recognized as an array so I could just pop it into a for loop as so?

Yes you can do that by implementing Iterable interface:

class MyList<T> implements Iterable<T> {

    Object[] arr;
    int size;

    public MyList() {
        arr = new Object[10];
    }
    public void add(T value) {
        arr[size++] = value;
    }

    @Override
    public Iterator<T> iterator() {
        Iterator<T> iterator = new Iterator<T>() {
            private int index = 0;

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

            @Override
            public T next() {
                return (T)arr[index++];
            }

            @Override
            public void remove() {

            }
        };

        return iterator;
    }
}

class Main {

    public static void main(String[] args) {

        MyList<String> myList = new MyList<String>();
        myList.add("abc");
        myList.add("AA");

        for (String str: myList) {
            System.out.println(str);
        }
    }
}

If you implement Iterable you will get the desired behavior.

class MyList<T> implements Iterable<T> {
    // your code
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM