19 Şubat 2020 Çarşamba

Maps Sınıfı

Giriş
Multimaps ile kardeştir.

difference metodu
MapDifference nesnesi döner. Bu nesneyi tek başına kullanamıyoruz. Bu nesneye ait entriesDiffering(),entriesOnlyOnLeft(),entriesOnlyOnRight(),entriesInCommon() gibi bir metodu kullanmak gerekiyor.

MapDifference.entriesDiffering() metodu
key değerleri aynı ancak value değerleri farklı olan nesneleri bir Map olarak döner.
Örnek
Şöyle yaparız
Map<String, LinkedHashMap<String, Object>> oldMap = ...;
Map<String, LinkedHashMap<String, Object>> currMap = ...;

MapDifference<String, LinkedHashMap<String, Object>> diff = 
        Maps.difference(oldMap, currMap);

Map<String, MapDifference.ValueDifference<LinkedHashMap<String, Object>>> entriesDiffering
  = diff.entriesDiffering();

MapDifference.entriesOnlyOnLeft() metodu
key değerleri sadece solda olan nesneleri bir Map olarak döner.

MapDifference.entriesOnlyOnRight() metodu
key değerleri sadece sağda olan nesneleri bir Map olarak döner.

MapDifference.entriesInCommon() metodu
key değerleri her ikisinde aynı olan nesneleri bir Map olarak döner.

Maps.difference() metodunda value nesnesinin hasCode() ve equals() metodu doğru çalışmalıdır. Value tipi array ise düzgün çalışmaz. Açıklaması şöyle.
doesn't work when the value type is array, as an array's equals() method compares identity and not the contents of the array:
Örnek
Şöyle yaparız.
Map<String, Object> leftFlatMap = ...;
Map<String, Object> rightFlatMap = ...;

MapDifference<String, Object> difference = Maps.difference(leftFlatMap, rightFlatMap);
newHashMap metodu
Şöyle yaparız.
Map<Integer, List<Integer> idMap = Maps.newHashMap();
toMap metodu
Listedeki her elemanı key yapar. Value için de belirtilen ValueSupplier metodu çağırır.

uniqueIndex metodu
Listedeki her elemanı value yapar. Key için de belirtilen KeyExtractor metodu çağırır.

Örnek
Şöyle yaparız.
Map<String,Role> mappedRoles = Maps.uniqueIndex(yourList, new Function<Role,String>() {
  public String apply(Role from) {
    return from.getName(); // or something else
  }});
Örnek
Şöyle yaparız.
private Map<String, Choice> nameMap(List<Choice> choices) {
  return Maps.uniqueIndex(choices, Choice::getName);
}

17 Şubat 2020 Pazartesi

Optional Sınıfı - Kullanmayın

Giriş
Şu satırı dahil ederiz. Java 8'den itibaren bu sınıfı kullanmaya gerek yok.
import com.google.common.base.Optional;
Bu sınıfın legacy (eski) olduğunu belirten bir açıklama şöyle.
Not inclined to add new features to our legacy Optional class; try to move to java.util.Optional if you can.
Bu sınıf immutable. Açıklaması şöyle.
An immutable object that may contain a non-null reference to another object. Each instance of this type either contains a non-null reference, or contains nothing (in which case we say that the reference is "absent"); it is never said to "contain null".
absent metodu
Şöyle yaparız.
Optional<String> str = Optional.absent();
fromJavaUtil metodu
Şöyle yaparız.
// ...
java.util.Optional<Integer> javaOptional = parseIntegerProperty("123")
someLegacyAPI(com.google.common.base.Optional.fromJavaUtil(javaOptional);
fromNullable metodu
Örnek
Şöyle yaparız.
Optional<Integer> parseIntegerPropertyGuava(String property) {
  return Optional.fromNullable(Ints.tryParse(property));
}
Örnek
Şöyle yaparız.
String foo = ...;
Optional<String> opt = Optional.fromNullable(foo);
of metodu
Şöyle yaparız.
Optional<String> strNormal = Optional.of("test");


ImmutableMultimap Sınıfı - Kullanmayın

Giriş
Bu sınıf yerine kalıtan sınıflar tercih edilmeli. Açıklaması şöyle
Warning: avoid direct usage of ImmutableMultimap as a type (as with Multimap itself). Prefer subtypes such as ImmutableSetMultimap or ImmutableListMultimap, which have well-defined equals(java.lang.Object) semantics, thus avoiding a common source of bugs and confusion.
Bu sınıftan kalıtanlar şöyle
ImmutableListMultimap, ImmutableSetMultimap


ImmutableListMultimap Sınıfı

inverse metodu
Şöyle yaparız
ImmutableListMultimap<Integer, String> originalMultimap = ImmutableListMultimap.of(
        1, "foo",
        1, "bar",
        2, "baz",
        42, "foo"
);
ImmutableListMultimap<String, Integer> convertedMap = originalMultimap.inverse();
System.out.println(convertedMap);   // {foo=[1, 42], bar=[1], baz=[2]}