如何使用lambda / Stream api按对象Attribute / Property过滤不同的元素

时间:2017-07-27 13:47:59

标签: java-8 java-stream

我有List Object。每个对象都有一个带有名为“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()是无效的。显示编译错误(无法解析方法)

1 个答案:

答案 0 :(得分:4)

您的代码中似乎有一些拼写错误,这应该有效:

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

您使用distinctByXyz时应该distinctByKey。那么f.getMap应该是f.getMap(),而且你的括号稍微偏离了。