30 Ocak 2020 Perşembe

Files Sınıfı İle Temporary Dizin Yaratma - NIO

Giriş
Dizin yaratma için createTempDirectory() kullanılır. Path nesnesi döner. Bu metodun 2 tane overload edilmiş hali var.
- Birinci halinde işletim sisteminde ayarlı temporary dizin kullanılır. İstersek dosyaya prefix verebiliriz.
- İkinci halinde kendi belirttiğimiz bir dizinde temporary dizin yaratılır

createTempDirectory metodu - String prefix
Yaratılan dizin için File.deleteOnExit() yapılırsa JVM'den çıkarken dizin silinir.
Örnek
Şöyle yaparız. İşletim sisteminde ayarlı temporary dizin kullanılır.
// C:\Users\Anghel\AppData\Local\Temp\8083202661590940905
Path tmpNoPrefix = Files.createTempDirectory(null);
Örnek
Şöyle yaparız. İşletim sisteminde ayarlı temporary dizin kullanılır.
// C:\Users\Anghel\AppData\Local\Temp\logs_5825861687219258744
String customDirPrefix = "logs_";
Path tmpCustomPrefix = Files.createTempDirectory(customDirPrefix);
createTempDirectory metodu - Path + String prefix + attributes
İmzası şöyle.
public static Path createTempDirectory(Path dir,
                       String prefix,
                       FileAttribute<?>... attrs)
                                throws IOException
Açıklaması şöyle.
Creates a new directory in the specified directory, using the given prefix to generate its name. The resulting Path is associated with the same FileSystem as the given directory.
The details as to how the name of the directory is constructed is implementation dependent and therefore not specified. Where possible the prefix is used to construct candidate names.
Örnek
Şöyle yaparız. Belirttiğimiz dizin kullanılır.
// D:\tmp\logs_10153083118282372419
Path customBaseDir = FileSystems.getDefault().getPath("D:/tmp");
String customDirPrefix = "logs_";
Path tmpLocation = Files.createTempDirectory(customBaseDir, customDirPrefix);


17 Ocak 2020 Cuma

StackWalker Sınıfı

Giriş
java 9 ile geliyor.

getInstance metodu
Şöyle yaparız.
public static void showTrace() {

  List<StackFrame> frames =
    StackWalker.getInstance( Option.RETAIN_CLASS_REFERENCE )
               .walk( stream  -> stream.collect( Collectors.toList() ) );

  for ( StackFrame stackFrame : frames )
    System.out.println( stackFrame );
}

Awt Robot Sınıfı

Giriş
Şöyle yaparız.
import java.awt.Robot;
constructor
Şöyle yaparız.
Robot r= new Robo t();
createScreenCapture metodu
Örnek - AWT Bileşeni
Şöyle yaparız. Esas kod burada.
public static BufferedImage createImage(Component component)
  throws AWTException {

  Point p = new Point(0, 0);

  SwingUtilities.convertPointToScreen(p, component);

  Rectangle region = component.getBounds();
  region.x = p.x;
  region.y = p.y;

  BufferedImage bufferedImage = new Robot().createScreenCapture(rectangle);
  return bufferedImage;

}
Örnek - Tüm Ekran
Şöyle yaparız
try {
  Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
  BufferedImage  capture = new Robot().createScreenCapture(screenRect);
  ImageIO.write(capture, "JPEG", new File("printed1.jpg"));
} catch (Exception e) {
  e.printStackTrace();
}
delay metodu
Şöyle yaparız.
r.delay (500);
getPixelColor metodu
Şöyle yaparız.
Rectangle screenRect = new Rectangle (700, 50, 530, 950);

float[] color = new float[3];
r.getPixelColor (755, 800).getRGBColorComponents (color);
keyPress metodu
Şöyle yaparız.
r.keyPress (20);
keyRelease metodu
Şöyle yaparız.
r.keyRelease (20);
mouseMove metodu
Şöyle yaparız.
r.mouseMove (755, 850);
mousePress metodu
Şöyle yaparız.
r.mousePress (InputEvent.BUTTON1_DOWN_MASK);
mouseRelease metodu
Şöyle yaparız.
r.mousePress (InputEvent.BUTTON1_DOWN_MASK);
Thread.sleep (100L);
r.mouseRelease (InputEvent.BUTTON1_DOWN_MASK);

16 Ocak 2020 Perşembe

Stream.reduce metodu

Giriş
- Accumulator'e geçilen birinci parametre Identity nesnesidir.Identity başlangıç değerini belirtir.
- Accumulator ikinci parametreyi Identity yani başlangıç nesnesine ekler ve tek bir sonuç döner.
- Combiner paralel stream'lerde kullanılır.

reduce() ve collect() Farkı
reduce() işlemi ile collect() işlemi çok benzerler. Aslında collect() işlemi mutable reduction olarak adlandırılabilir. Aralarındaki fark performanstır. Eğer biz bir sonucu bir container içinde toplamak istersek reduce() yerine collect() kullanmak gerekir
Örnek
Elimizde şöyle bir kod olsun
List<String> list = Arrays.asList("1", "2", "3"); 
  
// Example using the string concatenation operation
System.out.println(list.stream().parallel()
            .reduce("", (s1, s2) -> s1 + s2, (s1, s2)->s1 + s2));
Şöyle yaparız. Burada her şey StringBuilder içinde toplanıyor
System.out.println((StringBuilder)list.stream().parallel()
  .collect(
    StringBuilder::new, 
    StringBuilder::append, 
    StringBuilder::append
  )
);

reduce ve diğer tek sonuç dönen metodlar
Açıklaması şöyle
Stream reduction is an operation that returns one value by combining the elements of a stream. The Java stream api contains a set of predefined reduction operations, such as average(), sum(), min(), max(), and count(). There is one general-purpose operation: reduce().
reduce metodu - Accumulator
İmzası şöyle. Identity yani başlangıç değeri almadığı için Optional döner.
Optional<T> reduce(BinaryOperator<T> accumulator);
Açıklaması şöyle. Accumulator iki tane nesne alır ve bir sonuç döner.
itemAccumulator – a function that takes two parameters: a partial result of the reduction operation and the next element of the stream
Örnek
Şöyle yaparız
Optional<Student> oldestStudent = students.stream()
  .reduce((s1, s2) -> s1.age() > s2.age() ? s1 : s2);
reduce metodu - Identity + Accumulator
Burada Identity yani başlangıç değeri aldığı için Optional dönmesine gerek yok. Direkt değer tipinden bir sonuç döner.

Örnek
Şöyle yaparız
List<Integer> list = ...
Optional<Integer> sum  = list.stream()
  .reduce((a,b) -> a + b); //no identity element provided


List<Integer> list = ...;
Integer sum  = list.stream()
  .reduce(0, (a,b) -> a + b); //identity element provided
Örnek
Şöyle yaparız.
return Stream.of(...)
  .reduce(Stream.empty(), (a,b) -> Stream::concat)
  .collect(Collectors.toList());
reduce metodu - Identity + Accumulator + Combiner
İmzası şöyle.
<U> U reduce(U identity,
             BiFunction<U, ? super T, U> accumulator
             BinaryOperator<U> combiner);
Açıklaması şöyle. Combiner paralel stream'lerde kullanılır.
When a stream executes in parallel, the Java runtime splits the stream into multiple substreams. In such cases, we need to use a function to combine the results of the substreams into a single one. This is the role of the combiner
Açıklaması şöyle. Combiner accumulator parametre tipleri arasında uyumsuzluk varsa kullanılır.
Combiner – a function that takes two parameters: a partial result of the reduction operation and the next element of the stream Combiner – a function used to combine the partial result of the reduction operation when the reduction is parallelized, or when there’s a mismatch between the types of the accumulator arguments and the types of the accumulator implementation
Açıklaması şöyle. Accumulator ve Combiner aynı şeyi yapmalıdır.
Additionally, the combiner function must be compatible with the accumulator function; for all u and t, the following must hold:
combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)
Örnek
Şu kod Accumulator toplama, Combiner ise çarpma yaptığı için yanlış.
 List<String> strs = ...

int ijk = strs.stream().reduce(0, 
  (a, b) -> { 
    return a + b.length();
  },
  (a, b) -> {
    return a * b;
  });
Örnek
Elimizde şöyle bir kod olsun. Bu kod derlenmez
List<User> users = Arrays.asList(new User("John", 30), new User("Julie", 35));
int computedAges = users.stream().reduce(0, 
  (partialAgeResult, user) -> partialAgeResult + user.getAge());
Açıklaması şöyle.
In this case, we have a stream of User objects, and the types of the accumulator arguments are Integer and User. However, the accumulator implementation is a sum of Integers, so the compiler just can’t infer the type of the user parameter.
Düzeltmek için şöyle yaparız
int computedAges = users.stream().reduce(0,
  (partialAgeResult, user) -> partialAgeResult + user.getAge(),
  Integer::sum);