11 Eylül 2017 Pazartesi

Stream Search Metodları

findAny metodu
Optional döner. findAny ve findFirst arasında fark yoktur. Fark parallelleştirmede ortaya çıkar. Paralel kodlarda findFirst() ilk elemanı dönerken findAny() herhangi bir elemanı dönebilir.

Örnek
Şöyle yaparız.
list.stream()
  .filter(e -> ...)
  .findAny()
  .orElseGet(() -> {
    return ...;
});
Örnek
Şöyle yaparız.
Optional<Something> s = list.stream()
  .filter(ele -> ele.isBlue())
  .map(Element::getSomething)
  .findAny();
findFirst metodu
findFirst() bir Optional döner ve stream'in akmasını durdurur.

Stream genelde önce filtre'ye tabi tutulur. Daha sonra findFirst() çağrılır.  Eğer eleman varsa akımdaki ilk elemanı verir.  Optional içinde elemana ulaşmak için get() çağrılır.
Örnek
Eğer filtre kullanmazsak findFirst() iterator ile aynıdır. Şu kod aynı değeri döndürür.
HashMap<String, String> map = ...
...
Map.Entry<String, String> entry1 = set.iterator().next();
Map.Entry<String, String> entry2 = set.stream().findFirst().get();
Örnek
Şöyle yaparız
System.out.println(
            "Result: " +
            Stream.of(1, 2, 3)
                    .filter(i -> {
                        System.out.println(i);
                        return true;
                    })
                    .findFirst()
                    .get()
    );
Örnek
findFirst() sonucu içinde eleman varsa, bu eleman ile bir işlem yapmak için ifPresent kullanılabilir.
IntStream.iterate(0, playerCount)
             .map(PigDice::turn)
             .filter(player -> player > -1)
             .findFirst()
             .ifPresent(
                player ->...);
Örnek
Eğer findFirst() sonucu içinde eleman yoksa, orElse() ile bir başka eleman dönmesi sağlanır.
public static <T> T coalesce(Supplier<T>... ts) {
    return asList(ts)
        .stream()
        .map(t -> t.get())
        .filter(t -> t != null)
        .findFirst()
        .orElse(null);
}

AtomicLong Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.util.concurrent.atomic.AtomicLong;
Bu sınıf yerine LongAdder tercih edilebilir

constructor
Şöyle kullanırız
final AtomicLong counter = new AtomicLong(); //0 olarak başlar.
constructor
Şöyle yaparız
AtomicLong counter = new AtomicLong  (ThreadLocalRandom.current().nextLong());
updateAndGet metodu
Eski değere bakarak yeni bir değer atama imkanı sağlar

Örnek
Şöyle yaparız. Eğer yeni değer, mevcut değere göre >= ise yeni değer atanır, değilse eski değer atanır. Yeni değeri dönerse işlem başarılıdır.
boolean setIfEqualOrGreaterThan(AtomicLong oldValue, long newValue) {
  return oldValue.updateAndGet(current -> 
    (newValue >= current) ? newValue : current) == newValue;
}

5 Eylül 2017 Salı

BufferedReader Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.io.BufferedReader;
Bu sınıfı her zaman try içinde kullanmak gerekir.
try(BufferedReader br = new BufferedReader(new FileReader("D:\\MyTasks.txt"));
   ){
  ...
}
catch(IOException e){...}
constructor - reader
Varsayılan bellek büyüklüğü 8192 byte büyüklüğünde. Açıklaması şöyle.
The buffer size may be specified, or the default size may be used. The default is large enough for most purposes.
InputStreamReader
Şöyle yaparız.
BufferedReader br = = new BufferedReader(new InputStreamReader(System.in));
FileReader
Şöyle yaparız.
File inFile = new File("books.txt");
BufferedReader br = new BufferedReader(new FileReader(inFile));
Şöyle yaparız.
BufferedReader read = new BufferedReader(new FileReader("CourseSample.txt"));
constructor - buffer size
İmzası şöyle
BufferedReader(Reader in, int sz)
Şöyle yaparız.
InputStream is = ...;
BufferedReader br = new BufferedReader(new InputStreamReader(
                    is, "UTF-8"), 8);
lines metodu - Java 8
Stream<String> döner Stream'ler ile kullanabilmemizi sağlar.  Stream yöntemi ile daha az bellek kullanabiliriz.

Tüm satırları almak için şöyle yaparız.
List<String> lines = br.lines().collect(Collectors.toList());
Satırı filtreleyerek bulmak için şöyle yaparız.
String line = br.lines().filter(s -> s.startsWith(str)).findFirst().get();
Satırları tek tek dolaşmak için şöyle yaparız.
try (BufferedReader reader = new BufferedReader(...)) {
  boolean hasError = false;
  boolean hasInsufficentPermission = false;
  reader.lines().map(String::toLowerCase).forEach(line-> {
    if(line.contains("error code: 2568")) hasError = true;
    if(line.contains("insufficient...")) hasInsufficentPermission = true;
  });
  ...
}
read metodu
Şöyle yaparız. İşlemde hata varsa -1 döner.
int value;
if ((value = reader.read()) != -1) {...}
readLine metodu
Şöyle yaparız.
String line = null;
while ((line = br.readLine()) != null) {...}
ready metodu
Örnek ver