11 Şubat 2020 Salı

Tables Sınıfı

Giriş
Şu satırı dahil ederiz.
import com.google.common.collect.Tables;
toTable metodu
Table nesnesinin Java 8 Stream ile kullanılabilmesini sağlar. Bir Collector döner.

Birinci parametre rowFunction, ikinci parametre columnFunction, üçüncü parametre valueFunction, dördünce parametre mergeFunction, beşinci parametre tableSupplier olarak kullanılır.

mergeFunction aynı row ve column değerlerine sahip satırlarda value değerini hesaplamak içindir.

toTable metodu - rowFunction + columFunction + valueFunction + tableSupplier
Örnek
Elimizde şöyle bir kod olsun.
List<ApplicationUsage> appUsageFromDB =
Şöyle yaparız. TableSupplier olarak HashBasedTable::create veriyoruz.
Table<String, String, ApplicationUsage> table2 = appUsageFromDB.stream()
  .collect(Tables.toTable(
    ApplicationUsage::getId,
    ApplicationUsage::getName,
    au -> au,
    HashBasedTable::create
));
Örnek
Elimizde iki tane table olsun.
Table<Long,String,Integer> tableOne
Table<Long,String,Integer> tableTwo
Table 1 şöyle olsun.
1L Fruits     20
2L Fruits     30
2L Vegetables 15
3L Vegetables 10
Table 2 şöyle olsun.
2L Fruits     10
2L Vegetables 40
3L Fruits     15
4L Vegetables 35
Birleşim olan Table 3 şöyle olsun isteyelim.
1L Fruits     20
2L Fruits     30 + 10 = 40
2L Vegetables 15 + 40 = 55
3L Vegetables 10
3L Fruits     15
4L Vegetables 35
Şöyle yaparız.
HashBasedTable<Long, String, Integer> sumTable = Stream.concat(
  tableOne.cellSet().stream(), tableTwo.cellSet().stream())
    .collect(Tables.toTable(Table.Cell::getRowKey,
      Table.Cell::getColumnKey,
      Table.Cell::getValue,
      Integer::sum, HashBasedTable::create));
toTable metodu - rowFunction + columFunction + valueFunction + + mergeFunction + tableSupplier
Örnek
Şöyle yaparız.
Table<Region, Country, List<City>> table = RECORDS.stream()
        .collect(toTable(
                r -> r.getRegion(),
                r -> r.getCountry(),
                r -> Lists.newArrayList(r.getCity()),
                (l, l2) -> {
                    l.addAll(l2);
                    return l;
                },
                HashBasedTable::create
        ));
Örnek
Şöyle yaparız.
Map<Integer, Integer> source = ...;

// compiles
Table<Integer, Integer, Integer> broker = source.entrySet().stream()
  .collect( Tables.toTable( e -> 0, e -> 0, e -> 0,
                    ( e1, e2 ) -> 0, HashBasedTable::create ) );
Örnek
Şöyle yaparız. row değeri owner, column değeri status ve value 1 olur. aynı row ve column değerleri için value toplanır.
List<Thing> listOfThings = ...;

Table<Owner, Status, Long> table = 
  listOfThings.stream().collect(
    Tables.toTable(
      Thing::getOwner,             // Row key extractor
      Thing::getStatus,            // Column key extractor
      thing -> 1,                  // Value converter (a single value counts '1')
      (count1, count2) -> count1 + count2, // Value merger (counts add up)
      HashBasedTable::create       // Table creator
  )
);

Hiç yorum yok:

Yorum Gönder