Комментарии 20
Это не набор библиотек, а одна.
Про кеширование можно было поподробнее написать, что можно делать soft/weak ключи/значения в любой комбинации.
Интересно, как они будут разруливать тот факт что в Java 8 довольно много перетянули. Либо объявлять deprecated пол-либы, либо делать несовместимую версию.
Про кеширование можно было поподробнее написать, что можно делать soft/weak ключи/значения в любой комбинации.
Интересно, как они будут разруливать тот факт что в Java 8 довольно много перетянули. Либо объявлять deprecated пол-либы, либо делать несовместимую версию.
вынести эти «пол-либы» в отдельную либу guava-java7?
Берётся maven modernizer plugin и ограничиваешь.
А можно пример как отфильтровать коллекцию, оставив только элементы с уникальным значением определенного поля?
Т.е. есть коллекция с объектами
Т.е. есть коллекция с объектами
{ name: "", val: "" }
и нужно оставить только объекты с уникальными name. Коллекцию в мльтимапу по полю -> мультимапу в мапу -> значения мапы трансформировать из коллекций в один конкретный элемент -> взять values у конечной мапы.
Вот пример:
Multiset<String> names = ImmutableMultiset.copyOf(Iterables.transform(pairs, Pair::getName));
result = Iterables.filter(pairs, pair -> names.count(pair.getName()) == 1);
О, интересная задачка, спасибо!
А вот решение на груви:
А вот решение на груви:
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
НЛО прилетело и опубликовало эту надпись здесь
можно короче:
final Collection<Obj> result = items.stream().collect(Collectors.toMap(Obj::getName, v -> v, (v0, v1) -> v0)).values();
Ваше решение решает другую задачу, как и решения dborovikov и SamSol. Lanwen попросил найти пары с уникальными именами, а не отбросить те пары, для которых уже встретился ключ.
Постараюсь объяснить как можно доступнее. Цитирую Lanwen: «Нужно оставить только объекты с уникальными name». Уникальные name — это те, что не повторяются. Например, если мы имеем:
то здесь среди объектов (Obj) нет объектов с уникальными именами, потому что имя «a» встречается три раза (а не один раз), а имя «b» встречается два раза. Алгоритм должен находить только такие объекты, имена которых втречаются только один раз.
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!
Но как же я рад, что пишу сейчас на 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)
}
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Чистый код с Google Guava