30 Aralık 2020 Çarşamba

URI Sınıfı

Giriş
URL sınıfı Http bağlantısı açabilir. URI sınıfı ise bu yeteneğe sahip değil.

getHost metodu
Örnek ver

IntelliJ Idea ve Veri tabanı

1. Ultimate Edition Kullanıyorsak
Export to Database
Bir veri tabanındaki tabloyu kolayca başka veri tabanına kopyalamak için kullanılır. 
1. Kaynak tablo açılır
2. Export to Database tıklanır
3. Kopyalanacak hedef veri tabanı seçilir ve işlem yapılır

2. Community Edition Kullanıyorsak
Database Navigator eklentisi kurulur. Bu eklentiyle çalışmak ta güzel

3. JPA Buddy
Bu eklenti (plugin) JPA ile çalışmayı kolaylaştırıyor. Şeklen şöyle

3.1 Reverse Engineering
JPA Buddy veri tabanından tersine mühendislik ile kod üretebilir. Yani Entity kodunu üretiyor. Açıklaması şöyle
If you connected your database to Intellij IDEA, and installed JPA buddy plugin then you can easily create an entity class with the help of plugin without writing a single line of code.

3.2. JPA Buddy DTO Generation
Açıklaması şöyle
If you use JPA Hibernate in your application, this will come in very handy. It is very common to use the entity class to create the object directly at the place of generation of data, but sometimes that is not suitable. In such cases we need a DTO to transform the data into persistable form. Here, JPA Buddy comes in clutch where you can create a DTO directly from the entity and edit it the way you want. This is especially useful when you need DTOs for multiple entities. Within a couple of clicks you’ll have all the DTOs ready.

29 Aralık 2020 Salı

Optional.orElseGet metodu - Supplier Kullanır

Giriş
Açıklaması şöyle.
This method returns the value if present. Otherwise, it invokes other and returns the result of the invocation.
Optional boş değilse taşıdığı değeri, boşsa belirtilen supplier çağrısının sonucunu döner.
İmzası şöyle
public T orElseGet(Supplier<? extends T> supplier)
//If a value is present, returns the value, otherwise returns the result produced by the
//supplying function.
//Parameters:
//supplier - the supplying function that produces a value to be returned
//Returns:
//the value, if present, otherwise the result produced by the supplying function
//Throws:
//NullPointerException - if no value is present and the supplying function is null
orElse() ile Farkı
orElseGet() lazy çalışır. orElse() ise lazy değildir
Elimizde şöyle bir kod olsun. constructTableFromCache() null dönmese dahi, fetchTableFromRemote() çalıştırılır
public Optional<Table> retrieveTable() {
  return Optional.ofNullable(constructTableFromCache())
                 .orElse(fetchTableFromRemote());
}
Bunu engellemek için şöyle yaparız
public Optional<Table> retrieveTable() {
return Optional.ofNullable(constructTableFromCache()) .orElseGet(this::fetchTableFromRemote); }
Örnek
Şöyle yaparız.
return stuff().that().returns().optional().orElseGet(() -> {
    ...
    return alternateResult;
});

Optional.orElseThrow metodu

Giriş
Bu metodun iki tane overload edilmiş hali var. Hangisini kullanırsak kullanalım amaç if/else cümlelerinden kurtulmak. 
Örnek
Şöyle kod istemiyoruz
Optional<User> userOptional = userDao.findByCellNumber(cellNumber);
if (!userOptional.isPresent()) {
  throw new UserNotFoundException("...");
} else {
  User user = userOptional.get();
  //...
}
Bunu şöyle istiyoruz
User user = userDao.findByCellNumber(cellNumber).orElseThrow(UserNotFoundException::new);
orElseThrow metodu 
 Açıklaması şöyle.
If the value is present, this method returns the contained value. Otherwise, it throws an exception to be created by the provided supplier.
Java 10 ile geliyor. Supplier vermeye gerek yok. NoSuchElementException fırlatır.

Örnek
Şöyle yaparız.
Optional<Integer> anyOddInStream = Stream.of(2, 4, 6, 8)
                                         .filter(x -> x % 2 == 1)
                                         .findAny();
var current = anyOddInStream.orElseThrow(); 
orElseThrow metodu - Supplier
İmzası şöyle
T orElseThrow(Supplier<? super T> exceptionSupplier)
Örnek
Şöyle yaparız.
// exception could be replaced with any other
Integer opt = anyOddInStream.orElseThrow(
                           () -> new NoSuchElementException("No value present"));

28 Aralık 2020 Pazartesi

Jakarta EE

Giriş
Jakarta 9 ile javax.* isim alanı jakarta.* olarak değiştirildi. Çünkü Java Community Process (JCP)'den Eclipse Foundation' a devredildi

Jakarta EE aslında sadece bir specification. Bunu gerçekleştirenler GlassFish, JBoss, WebSphere gibi Application Server'lar.

Javadoc burada.

Arayüzler
TimerService Arayüzü

Anotasyonlar
@Model Anotasyonu
Açıklaması şöyle
The CDI framework provides us with a built-in stereotype @javax.enterprise.inject.Model which is intended for use with beans that define the model layer of an MVC web application architecture such as Jakarta Server Faces.

Widfly
Widfly yazısına taşıdım

25 Aralık 2020 Cuma

Java 13 Text Blocks

Giriş
Java 13 ile geliyor. Çok satırlı (multi-line) string imkanı tanıyor. Text Block """ ile başlar ve """ ile biter. Açıklaması şöyle
The opening delimiter is defined by a sequence of three double quotes, followed by zero or more spaces and a line terminator. The content of the text block starts from the first character after the line terminator. Therefore, any white spaces between the three quotation marks and the line terminator are not taken into consideration.

The closing delimiter, on the other hand, is defined only by three double quotes sequence. The content of the text block ends with the character preceding the first double quotes in the sequence, of the closing delimiter.
Derleme Aşamaları
Açıklaması şöyle
There are three phases that are performed during compile-time:

- Normalization of line terminators.
- Removal of white spaces that were introduced to align the text block with the Java code.
- Interpretation of escape characters.
1. Normalization of Line Terminators
Açıklaması şöyle. Yani Line Terminator olarak \n karakteri kullanılır
Normalization for text blocks always transforms all line terminators into LF, regardless of the platform on which it runs. 
2. Removing Superfluous White Spaces
Açıklaması şöyle
After the normalization process, a text block will clearly consist of one or more lines. The algorithm for removing superfluous white spaces, (i.e., the spaces introduced to align the text block code with the Java code) includes:

- The removal of all of the white spaces that are at the end of each line.
- The removal of all of the white spaces that are at the beginning of each line, common to all lines.
Açıklaması şöyle
The algorithm described in this section is implemented through the use of the static method of the String class introduced with Java 13 stripIndent.
Örnek
Şöyle yaparız. Burada en son kapanma bölümünü satır başına aldığımı için "minimum number of common initial white spaces" 0 oluyor, çıktı da sağa doğru kayar
String textBlock = """
    This is a text block!
""";
3. Interpretation of escape characters
Açıklaması şöyle. Yani \" yapmaya gerek yok
Technically it is also possible to use the escape characters, and \", but it is useless and therefore not recommended.


Optional.orElse metodu - Sabit Değer Döner

Giriş
Optional.orElse() daha çok metod sonucunda null dönme ihtimali varsa null dönmek yerine default bir değer dönmek için kullanılır. Açıklaması şöyle. yapılır.
Returns the value if present otherwise, returns other.
İmzası şöyle
public T orElse(T other)
//If a value is present, returns the value, otherwise returns other.
//Parameters:
//other - the value to be returned, if no value is present. May be null.
//Returns:
//the value, if present, otherwise other

İlgili Metodlar
orElse ile ilgili diğer metodlar şöyle
isPresentOrElse() 

orElseGet() ile Farkı
orElseGet() lazy çalışır. orElse() ise lazy değildir

Elimizde şöyle bir kod olsun.  orElse() kullandığımız için myFunc() metodunun çağrıldığını görürüz.
Optional<Foo> opt = ...
opt.orElse(myFunc(...));
orElseGet() lamda aldığı için lazy. Dolayısıyla çözüm olarak şöyle yapmak gerekir.
opt.orElseGet(() -> myFunc(...));
Yanlış Kullanım
Örnek - orElse(null)
Varsayılan değer olarak null dönmek çok iyi bir fikir değil.

Doğru Kullanım
Örnek
Elimizde şöyle bir kod olsun
public String getPersonName() {
  Optional<String> name = getName();
  if (name.isPresent()) {
    return name.get();
  }
  return "DefaultName";
}
Bu kodu şöyle yapabilirim
public String getPersonName() {
  Optional<String> name = getName();
  return name.orElse("DefautName");
}

23 Aralık 2020 Çarşamba

Collectors.maxBy metodu

Örnek
Şöyle yaparız
List<String> strings = Arrays.asList("alpha","beta","gamma");
strings .stream() .collect(Collectors.maxBy(Comparator.naturalOrder())) .get(); // output: gamma

Collectors.minBy metodu

Örnek
Şöyle yaparız
List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
List<String> strings = Arrays.asList("alpha","beta","gamma");
integers
    .stream()
    .collect(Collectors.minBy(Comparator.naturalOrder()))
    .get();
// output: 1
strings
   .stream()
   .collect(Collectors.minBy(Comparator.naturalOrder()))
   .get();
// output: alpha

Collectors.counting metodu

Giriş 
Döndürülen collection içindeki eleman sayısını verir

Stream.count() vs Collectors.counting()
Aslında her ikisi de aynı şeyi yapıyorlar. 

Fark 1
Yani şu ikisi de aynı çıktıyı verir
System.out.println(Stream.of(1, 2, 3, 4, 5)
        .map(i -> {
            System.out.println("processing " + i);
            return i * 2;
        }).count());

System.out.println(Stream.of(1, 2, 3, 4, 5)
        .map(i -> {
            System.out.println("processing " + i);
            return i * 2;
        }).collect(Collectors.counting()));
Ama Stream.count() gerekirse, aradaki işlemleri atlayarak direkt sonuç dönebilir. Açıklaması şöyle
An implementation may choose to not execute the stream pipeline (either sequentially or in parallel) if it is capable of computing the count directly from the stream source. In such cases no source elements will be traversed and no intermediate operations will be evaluated...
Fark 2
Collectors.counting() aslında gruplama için daha uygun. Şöyle yaparız
Map<String, Long> collect = 
   wordsList.stream().collect(groupingBy(Function.identity(), counting())); 
Kullanım

Örnek
Şöyle yaparız
List<Integer> integers = Arrays.asList(1,2,3,4,5,6,6);
Long collect = integers
                   .stream()
                   .filter(x -> x < 4)
                   .collect(Collectors.counting());
// output: 3
Örnek
Elimizde bir sözcük listesi olsun. Listedeki sözcüklerin frekans tablosunu çıkarıp belli bir değerin üzerinde olan sözcüklerin sayısını şöyle buluruz.
int countThreshold = 2;
long sum =
    words.stream()
          .collect(Collectors.groupingBy(Function.identity(),
                                         Collectors.counting()))
          .values()
          .stream()
          .filter(x -> x >= countThreshold)
          .reduce(0L, Long::sum);
Örnek
İki setin kesişimi kaç tane elemandan oluşur diye bulmak isteyelim. Şöyle yaparız.
Set<String> sOne = ...; Set<String> sTwo = ...;
long numFound = sOne.parallelStream()
                    .filter(segment -> sTwo.contains(segment))
                    .collect(Collectors.counting());


Collectors.toUnmofifiableList metodu

Giriş 
Java 10 ile geliyor. Açıklaması şöyle.
The Collectors.toUnmodifiableList would return a Collector that disallows null values and will throw NullPointerException if it is presented with a null value.
Örnek
Şöyle yaparız.
List<Integer> result = Arrays.asList(1, 2, 3, 4)
            .stream()
            .collect(Collectors.toUnmodifiableList());