我有一个ListObject。每个对象都有一个带有名为“xyz”的键的映射。我希望列表中的元素对该特定键具有唯一的值。

我知道我们可以使用set / map轻松做到这一点,但是我特别在寻找lambda解决方案。

我以为这样可以。

list.stream()
    .filter(distinctByXyz(f -> f.getMap.get("xyz")))
    .collect(Collectors.toList()));

我有一个区分它们的功能
private <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor){
    Map<Object, Boolean> map = new ConcurrentHashMap<>();
    return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

问题是过滤器内部的函数f.getMap()无法正常工作。显示编译错误(无法解析方法)

最佳答案

您的代码中似乎有一些错别字,这应该可以工作:

list
  .stream()
  .filter(distinctByKey(f -> f.getMap().get("xyz")))
  .collect(Collectors.toList());

您实际上在使用distinctByXyz时应该使用distinctByKey。然后f.getMap可能应该是f.getMap(),并且您的括号略有偏离。

10-06 16:21