Monday, July 8, 2013

Java 8 ile Sayısal Loto Oynamak

Sayısal Loto için 1-49 arasında biri birinden farklı altı sayı çeken ve ekrana sıralı olarak yazdıran programı Java programlama dilinde farklı yaklaşımlarla yazmaya çalışalım.
İlk olarak çözümü Java dizilerini kullanarak oluşturalım:
package com.example.lottery;

import java.util.Arrays;
import java.util.Random;

public class LotteryArrays {
 private static final int SIZE = 6;
 private static final int MIN_VALUE = 1;
 private static final int MAX_VALUE = 49;
 private static Random random= new Random();

 public static void main(String[] args) {
  int[] numbers = new int[SIZE];
  Arrays.fill(numbers, MIN_VALUE + MAX_VALUE);
  for (int i = 0; i < SIZE; ++i) {
   int candidate = 0;
   do {
    candidate = random.nextInt(MAX_VALUE) + 1;
   } while (Arrays.binarySearch(numbers, candidate) > 0);
   numbers[i] = candidate;
   Arrays.parallelSort(numbers);
  }
  System.out.println(Arrays.toString(numbers));
 }
}
Çözümde Arrays sınıfının binarySearch() ve parallelSort() metodlarını kullanmış olmak işimizi epey kolaylaştırdı. 

Şimdi de aynı problemi Java'daki Collections API'yi kullanarak çözelim. Eğer Set ve TreeSet sınıflarını kullanmayı akıl edersek çözüme hızlı bir şekilde ulaşabiliriz:

1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.console;

import java.util.Random;
import java.util.Set;
import java.util.TreeSet;

/**
 *
 * @author Binnur Kurt (binnur.kurt@gmail.com)
 */
public class LotteryCollections {
    private static final int SIZE = 6;
    private static Random random;
    public static void main(String[] args) {
        random = new Random();
        Set<Byte> numbers= new TreeSet<>();
        while (numbers.size()<SIZE){
           numbers.add((byte) (random.nextInt(49) + 1));
        }
        System.out.println(numbers);
    }
}

Son olarak aynı problemi Java 8 ile birlikte gelen Lambda ifadeleri ve Map/Reduce çatısını kullanarak çözelim:
package com.example.lottery;

import java.util.Random;

/**
 *
 * @author Binnur Kurt (binnur.kurt@gmail.com)
 */
public class LotteryLambda {
    public static void main(String[] args) {
         new Random()
             .ints(1,50)
             .parallel()              
             .distinct()
             .limit(6)
             .sorted()
             .sequential()                
             .forEach(System.out::println);                             
    }
}
Koda bakınca Java 8'in soyutlama gücünün arttığını hissetmişsinizdir. Çünkü artık lambda ifadeleri yazabiliyoruz, fonksiyonel programlama yapabiliyoruz. Fonksiyona parametre  olarak fonksiyon geçebiliyoruz. Fonksiyonel programlama ile bildirimsel programlamaya (=declarative programming) geçiş yapıyoruz. Buna karşın yukarıdaki ilk iki örnekte ise buyruksal programlama (=imperative programming) uygulaması var. Nesneye dayalı programlama ile hem bildirimsel hem de buyruksal programlama yapılabilir. Java 8 ile birlikte Java'da fonksiyonel programlama yapabiliyor olsak da Java saf bir fonksiyonel programlama dili değildir.

1 comment:

  1. Gerçekten mükemmel bir anlatım hocam..elinize sağlık ..

    ReplyDelete