Pull to refresh

Comments 20

Это не набор библиотек, а одна.

Про кеширование можно было поподробнее написать, что можно делать soft/weak ключи/значения в любой комбинации.

Интересно, как они будут разруливать тот факт что в Java 8 довольно много перетянули. Либо объявлять deprecated пол-либы, либо делать несовместимую версию.
вынести эти «пол-либы» в отдельную либу guava-java7?
Как вариант. Но насколько я знаю, разрабы еще не определились с решением.
Многого в java 8 все же нету, выпилят collections и будут будут дальше делать)
А можно пример как отфильтровать коллекцию, оставив только элементы с уникальным значением определенного поля?
Т.е. есть коллекция с объектами { name: "", val: "" } и нужно оставить только объекты с уникальными name.
Коллекцию в мльтимапу по полю -> мультимапу в мапу -> значения мапы трансформировать из коллекций в один конкретный элемент -> взять values у конечной мапы.
Вот пример:
Multiset<String> names = ImmutableMultiset.copyOf(Iterables.transform(pairs, Pair::getName));
result = Iterables.filter(pairs, pair -> names.count(pair.getName()) == 1);
А что то типа оператора distinct нет? Но обычно usual-way найти коллекцию уникальны это добавление в Set.
О, интересная задачка, спасибо!

А вот решение на груви:
def items = [
        [name: 'a', val: 4],
        [name: 'a', val: 5],
        [name: 'b', val: 6],
        [name: 'a', val: 7],
        [name: 'b', val: 3]
]

def expected = [
        [name: 'a', val: 4],
        [name: 'b', val: 6],
]

def result = items.groupBy { it.name }.collect { it.value.first() }

assert expected == result
А на питоне придумалось только это:
items = [
    {'name':'a', 'val':4},
    {'name':'a', 'val':5},
    {'name':'b', 'val':6},
    {'name':'a', 'val':7},
    {'name':'b', 'val':3}
]

expected = [
    {'name':'a', 'val':4},
    {'name':'b', 'val':6},
]

result = []
for item in items:
    if item['name'] in [r['name'] for r in result]:
        continue
    result.append(item)

assert expected == result
А вот решение на чистой Java 8:

List<Obj> items = Arrays.asList(
        Obj.of("a", 4),
        Obj.of("a", 5),
        Obj.of("b", 6),
        Obj.of("a", 7),
        Obj.of("b", 3));
List<Obj> result = items.stream()
        .collect(Collectors.groupingBy(Obj::getName)).entrySet().stream()
            .map(x -> x.getValue().get(0))
            .collect(Collectors.toList());
можно короче:
final Collection<Obj> result = items.stream().collect(Collectors.toMap(Obj::getName, v -> v, (v0, v1) -> v0)).values();
Ваше решение решает другую задачу, как и решения dborovikov и SamSol. Lanwen попросил найти пары с уникальными именами, а не отбросить те пары, для которых уже встретился ключ.
решение согласно поставленной задаче — найдены объекты с уникальными значениями в поле name. Какую задачу решаете вы? и откуда появились "пары с уникальными именами"?
Постараюсь объяснить как можно доступнее. Цитирую Lanwen: «Нужно оставить только объекты с уникальными name». Уникальные name — это те, что не повторяются. Например, если мы имеем:
List<Obj> items = Arrays.asList(
        Obj.of("a", 4),
        Obj.of("a", 5),
        Obj.of("b", 6),
        Obj.of("a", 7),
        Obj.of("b", 3));

то здесь среди объектов (Obj) нет объектов с уникальными именами, потому что имя «a» встречается три раза (а не один раз), а имя «b» встречается два раза. Алгоритм должен находить только такие объекты, имена которых втречаются только один раз.
Еще нужно чтобы toMap создавал LinkedHashMap, иначе элементы в произвольном порядке возвращаются
items.stream().collect(
        Collectors.toMap(item -> item.get("name"), v -> v, (v0, v1) -> v0, LinkedHashMap::new)
).values();
<занудаВкл>в условиях задачи этого требования нет</занудаВыкл>
Да, Guava — классная библиотека, в Java без неё никуда.

Но как же я рад, что пишу сейчас на Scala!
case class Person(lastName: String, 
                  middleName: String, 
                  firstName: String, 
                  zipCode: String) extends Ordered[Person] {
  import scala.math.Ordered.orderingToOrdered
  def compare(that: Person) = 
    (this.lastName, this.middleName, this.firstName, this.zipCode) compare
    (that.lastName, that.middleName, that.firstName, that.zipCode)
}
Это что! Ещё есть всякие апач коммонс. Но я тоже очень рад что ушел на Scala.
Sign up to leave a comment.

Articles