Collections – Sorted Map Interface

Hi all! Today i’m going to tell about Sorted Map Interface. We talked about Map Interface before this article. This interface extends Map interface. For example class that implements this interface is TreeMap.
Sorted Map doesn’t allow null keys and null values and it stores elements by sorting with keys.

Let’s take a look Sorted Map methods in shortly

subMap(K fromKey, K toKey) : It returns part of Map with keys range.
headMap(K toKey) : It returns part of Map whose keys are strictly less than toKey
tailMap(K fromKey) : It returns part of Map whose keys are greater than or equal fromKey
firstKey() : It returns fırst key currently in this Map.
lasKey() : It returns last key currently in this Map.
comparator() : It returns the Comparator used to order the keys in this Map.

Let’s check the example code.

import java.util.*;

public class Main {

    public static void main(String... args) {
        SortedMap<Integer, String> ageNameMap = new TreeMap<>();
        ageNameMap.put(26, "Ufuk");
        ageNameMap.put(24, "Halis");
        ageNameMap.put(28, "Alice");

        write(ageNameMap);
        System.out.println("---------------------------------------");
        System.out.println(ageNameMap.subMap(24,26));
        System.out.println(ageNameMap.headMap(27));
        System.out.println(ageNameMap.tailMap(25));
        System.out.println(ageNameMap.firstKey());
        System.out.println(ageNameMap.lastKey());
    }

    private static void write(Map map) {
        Set<Map.Entry> entries = map.entrySet();
        for (Map.Entry entry : entries) {
            System.out.println("Key : " + entry.getKey());
            System.out.println("Value : " + entry.getValue());
        }
    }
}

Collections – Map Interface

Hi everyone! Today i’m going to explain about Map Interface in Java. We started the these article series with Collections and Map Interface is a valuable part of that Collection Framework. But Map interface is not a subtype Collection Interface. It behaves little bit different.
Map stores elements key-value pairs. You can access to values with key. It can not contains duplicate keys. Each key has only one value. Some of Map implementations can allow null value(key or value) but some of not. Example, HashMap and LinkedHashMap allow that but TreeMap doesn’t allow.

Lets take a look Map interface methods in shortly.

public Object put(Object key, Object value) : This method is used to insert an entry in this map
public void putAll(Map map) : This method is used to insert a map in this map.
public Object remove(Object key) : This method is used to remove an entry for key
public Object get(Object key)  : This method is used to get value for key
public boolean containsKey(Object key) : This method is used to check key is exists.
public Set keySet() : This method returns containing all keys
public Set entrySet() : This method returns containing all keys and values.

Here is the example of code about Map Interface.

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Main {

    public static void main(String... args) {
        Map<String, Integer> nameAgeMap = new HashMap<>();
        // Adding elements to map
        nameAgeMap.put("Ufuk", 26);
        nameAgeMap.put("Halis", 26);
        nameAgeMap.put("Alice", 30);

        write(nameAgeMap);
        System.out.println("------------------------------------");
        //Removing element from map
        nameAgeMap.remove("Ufuk");
        write(nameAgeMap);
        System.out.println("Map contains key Ufuk : " + nameAgeMap.containsKey("Ufuk"));
    }

    private static void write(Map map) {
        Set<Map.Entry> entries = map.entrySet();
        for (Map.Entry entry : entries) {
            System.out.println("Key : " + entry.getKey());
            System.out.println("Value : " + entry.getValue());
        }
    }
}

Collections – Giriş

Merhabalar, bu yazımda Java‘da Collections‘a giriş yapacağım ve sonraki yazı serilerinde bu framework içinde bulunan class‘ları ve interface‘leri anlatmaya devam edeceğim.

Collections, Java içerisinde büyük bir öneme sahiptir ve bu yüzden Java‘da öğrenilmesi gereken en önemli alanlarından biridir. Sonuçta kodlama yaparken kullandığımız List, Map, nedir, nasıl çalışır, avantajları vs gibi durumlarınların bilinmesi bizi daha efektif kod yazmaya iter.

Java‘da Collections‘dan önce, array, vector ve hashtable bulunmaktaydı. Bu 3 farklı collection‘nın ortak bir interface‘i yoktu. Yani her biri için farklı metotlar, farklı member‘lar anlamına geliyordu. Bu da programcı için bir dezavantaja dönüşmekteydi. Bu daha da ileride işkenceye dönüşmemesi için Java‘yı geliştirenler, ortak bir interface‘e sahip ve önceki Collection‘ların problemlerini çözecek bir framework tasarladılar ve böylece Collection Framework‘ü doğmuş oldu.

Collection Framework‘ünün avantajlarından şöyle bahsedebiliriz.

  • Tutarlı(Consistent) bir API.
  • Programlama efortunu kısaltma.
  • Programlama hızını ve kalitesini arttırma.

Core olarak yer alan interface‘leri incelersek;

             Collection                Map
         /     /    \      \            |
        /      /      \     \           |
     Set    List    Queue  Dequeue   SortedMap
     /
    /
 SortedSet

Collection : En tepedeki interface’dir. add(), remove(), contains(), isEmpty(), addAll() gibi metotları bulunmaktadır.

Set : Duplicate eleman yer almaz. Örnek olarak HashSet ve TreeSet(SortedSet sınıfını implements eder) verilebilir.

List : Duplicate eleman içerebilir. Elemanlar sıralıdır. Örnek olarak LinkedList ve ArrayList verilebilir.

Queue : FIFO prensibine göre hareket eder.

Dequeue : LIFO ve FIFO prensiplerini destekler.

Map : Elemanları keyvalue şeklinde saklar. Duplicate elemanlara izin vermez. Örnek olarak HashMap ve TreeMap(SortedMap interface’i implement eder.) verilebilir.

Collections giriş olarak şimdilik bu kadar, sonraki yazılarda yer alan interface‘leri örnekler ile incelemeye başlayacağız.

Reflection API

Merhabalar, bu yazımda Java’daki Reflection API‘ye kısaca değineceğim. Reflection API, çalışma zamanı anında, metotların, sınıfların ve interface’lerin davranışlarını incelemek veya değiştirmek için kullanılır.

Reflection, bir nesnenin hangi sınıfa ait olduğu ve nesneye ait hangi metotların koşturulabileceği hakkında bilgiler verir ve bunu runtime anında yapar.

getClass() metoduyla nesnenin ait olduğu sınıfın ismine erişilebilir.
getConstructors() metoduyla nesnenin ait olduğu sınıfın public constructor‘larına erişilebilir.
getMethods() metoduyla nesnenin ait olduğu sınıfın public metodlarına erişilebilir.

Eğer bir sınıfın sahip olduğu private field‘lara veya metotlara erişmek istersek şu şekilde ilerleyebiliriz.
Class.getDeclaredField(FieldName) ile Field nesnesini aldıktan sonra Field.setAccessible(true) yaparak, access modifier‘ından bağımsız olarak metot veya field‘a erişim sağlanabilir.

Reflection‘lar sahip oldukları bu özellikleriyle bize genişletilebilirlik(Extensibility) anlamında avantajlar sağlamaktadır. Ancak bir nesnenin hangi sınıfa ait olduğu bilip Reflection API kullanmadan yapmak performans açısından daha iyidir. Bu nedenle sıklıkla kullanılan kodlarda Reflection API kullanılmasından kaçınılmalıdır. Ayrıca Reflection abstraction kavramını da yok etmeye meyillidir.

Yukarıda bahsettiklerimi basit olarak kodda aşağıdaki gibi uygulayabiliriz.

ReflectionTest.java

public class ReflectionTest {
    private String str;

    public ReflectionTest() {

    }

    public void method1() {
        System.out.println("Method 1 worked");
    }

    public void method2() {
        System.out.println("Method 2 worked");
    }

    public String getStr() {
        return str;
    }
}

Main.java

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    public static void main(String... args) throws
            NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException {
        ReflectionTest test = new ReflectionTest();
        Class clazz = test.getClass();
        System.out.println("test object class name : " + clazz.getName());
        System.out.println("test object class constructor name : "
                + clazz.getConstructor().getName());
        for (Method method: clazz.getMethods()) {
            System.out.println("Method Name : " + method.getName());
        }
        Method method1 = clazz.getMethod("method1");
        //calling method1
        method1.invoke(test);

        //private field accessing and set new value
        Field field = clazz.getDeclaredField("str");
        field.setAccessible(true);
        field.set(test, "TEST");
        System.out.println("str value : " + test.getStr());
    }
}

Batsy Restful Services Framework – PreRelease Yayında v0.0.1

Merhabalar, son bir haftadır uğraştığım bir Restful Service framework’nün ilk halini yayınlamış bulunuyorum. 🙂 İlerisi için de aklımda güzel planlar var(Eclipse ve Intellij plugin vb.). Şu aralar biraz dökümantasyon ve refactoring olarak geçiyor. Şuan single jar şeklinde projenize ekleyebilirsiniz. Tabi ki Maven Repo’da da yerini alacaktır. Detaylı bilgileri vs. projenin sitesinden öğrenebilirsiniz.

https://ufukhalis.github.io/batsy/

BatsyLogo