-- Java SE

Collection Interface

Collection element olarak tanımlanan bir grup nesneyi temsil eder. Collection interface’i maksimum genellik istenildiğinde kullanılır. Collectionlar, arguman olarak yine bir collection alabilecek constructorlara sahiptir.Bu constructor(conversion constructor) argüman olarak verilen collection ne olursa olsun, onun elementlerini içeren yeni bir collection oluşturur. Bu sayede collection tipini değiştirebiliriz.

Örneğin Collection<String> c şeklinde List, Set veya diğer Collection türlerinde olabilecek bir collection var, c’deki tüm elementleri içeren yeni bir collection oluşturmak istenildiğinde şöyle yapılır.

List<String> list = new ArrayList<String>(c);
List<String> list = new ArrayList<>(c); // JDK 7 ve sonrası.

Collection interface’i temel işler için int size(), boolean isEmpty(), boolean contains(Object element), boolean add(E element), boolean remove(Object elemet) ve Iterator<E> iterator() metodlarını içerir.

Ayrıca tüm collectionı etkileyen boolean containsAll(Collection<?> c), boolean addAll(Collection<? extends E> c), boolean removeAll(Collection<?> c), boolean retainAll(Collection<?> c), ve void clear() metodları vardır.

Array işlemleri için de Object[] toArray() ve <T> T[] toArray(T[] a) metodları tanımlıdır.

Traversing

Bir collection’ı gezmek için 3 farklı yöntem kullanılabilir.

1-Aggregate Operations

JDK 8 ve sonrası için tercih edilen collection iterate metodu bir stream oluşturmak ve üzerinde aggregate metodları çalıştırmaktır. Aggregate operationslar genellikle lambda expressionlarla kullanılır. Aşağıdaki kod parçaçığı sıralı olarak bir collectionı iterate eder ve RED nesneleri yazdırır.

myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

Eğer collection yeterince genişse ve bilgisayar yeterli kaynağa sahipse parallel stream da kullanılabilir.

myShapesCollection.parallelStream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));

2- for-each Construct

for-each construct kısaca for loop içerisinde collectionı gezmeye yarar. Aşağıdaki kod parçaçığı for-each kullanarak elementleri yazdırır.

for (Object o : collection)
    System.out.println(o);

3 – Iterators

Iterator ile bir collection gezilebilir. Bir collectionın iterator metodu çağrılarak Iterator oluşturulabilir. Aşağıdaki kod parçası Iterator interface’idir.

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional
}
hasNext() İterasyon hala elemente sahipse true dönderir.
next() Bir sonraki elementi dönderir.
remove() next() tarafından dönderilen son elementi siler.

Aşağıdaki kod parçaçığı bir Collection’ı filtrelemek için nasıl Iterator kullanılacağını gösterir. 

static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}

Collection Interface Bulk Operations

containsAll Hedef Collection, belirtilen Collectiondaki tüm elementleri içeriyorsa true dönderir.
addAll Belirtilen Collectiondaki tüm elementleri diğer collection’a ekler.
removeAll Belirtilen ve hedef Collectiondaki aynı elementleri hedef Collectiondan siler.
retainAll Belirtilen Collectionda olup, hedefte olmayan elementleri siler.
clear Tüm elementleri siler.

c.removeAll(Collections.singleton(null));  metodu c Collection‘dan tüm null değere sahip elementleri siler. Collections.singleton metodu belirtilen elementleri içeren immutable Set dönderir.

Collection Interface Array Operations

Örneğin c bir Collection olsun. Object[] a = c.toArray();  Kodu arrayin içerisinde collectiondaki tüm elementleri transfer eder.

Ya da c Collection<String> tipinde birşeyse, argüman kullanarak runtime tipi belirtebiliriz.String[] a = c.toArray(new String[0]);

Yorum bırak

Yorum