当前位置: 首页 > 知识库问答 >
问题:

Java 8按财产分列

夏兴平
2023-03-14

在Java 8中,我如何使用streamAPI通过检查每个对象属性的清晰度来过滤集合?

例如,我有一个Person对象列表,

persons.stream().distinct();

将对Person对象使用默认的相等性检查,因此我需要类似于,

persons.stream().distinct(p -> p.getName());

不幸的是,distince()方法没有这种重载。如果不修改Person类中的相等性检查,是否可以简洁地执行此操作?

共有2个答案

宋宇
2023-03-14

另一种方法是使用姓名作为关键字将这些人放在地图中:

persons.collect(Collectors.toMap(Person::getName, p -> p, (p, q) -> p)).values();

请注意,在重名的情况下,被保留的人将是第一个被限制的人。

程景胜
2023-03-14

distinct视为一个有状态筛选器。下面是一个函数,它返回一个谓词,该谓词维护关于之前看到的内容的状态,并返回给定元素是否是第一次看到的:

public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Set<Object> seen = ConcurrentHashMap.newKeySet();
    return t -> seen.add(keyExtractor.apply(t));
}

然后你可以写:

persons.stream().filter(distinctByKey(Person::getName))

请注意,如果流是有序的并且是并行运行的,这将保留重复元素中的任意元素,而不是像distince()所做的那样保留第一个元素

(这和我对这个问题的回答本质上是一样的:Java·兰姆达在任意键上的Stream Distinct()?)

 类似资料:
  • 类别声明: 据我所知,使用Java 8,我们可以进行如下排序: 但有没有办法根据子实体的属性对其进行排序,例如: 附言:所有人都支持任何俏皮话。

  • 两者之间有什么区别 静态归属[作者:作者] 当static bongsto=Author保留在Books域中时,对数据库没有影响。但是,静态bongsto=[author:author]创建了对author类的反向引用,并且在DB中还有author_id列。因此,实际只使用静态bongsto=Author所做的事情。这是在grails文档(http://grails.github.io/grail

  • 问题内容: 在程序运行之前,我需要从一个不知道的位置将一些属性加载到Spring上下文中。 所以我认为,如果我有一个不带位置的PropertyPlaceholderConfigurer,它将从系统属性中读取,然后可以在上下文中使用该位置:property- placeholder 像这样 但这是行不通的 保罗 问题答案: 这里的问题是您正在尝试使用属性占位符语法配置属性占位符:)这有点像鸡和蛋的情

  • 问题内容: 在python中,我可以使用装饰器向类添加方法。是否有类似的装饰器将属性添加到类?我可以更好地表明我在说什么。 我上面使用的语法是否可能还是需要更多的语法? 我想要类属性的原因是可以延迟加载类属性,这似乎很合理。 问题答案: 这是我的处理方式: 在我们打电话时,设置员没有工作 ,因为我们正在打电话 ,而不是。 添加元类定义可以解决此问题: 现在一切都会好起来的。

  • 问题内容: 当您这样做时: “类”字段到底是什么?我在API文档中找不到它。它是继承的静态字段吗? 我认为保留关键字不允许用作实体名称。 问题答案: 请阅读 : 类文字是由类,接口,数组或原始类型的名称或伪类型void组成的表达式,后跟“。”。和令牌类。类文字的类型C.Class,其中C是类,接口或数组类型的名称,是Class。如果p是原始类型的名称,则令B为装箱转换后的类型p的表达式的类型(第5

  • 我在对象映射器上使用Jackson的readValue()方法从JSON文件中读取并将其转换为我的java对象。 如。 我可以在MyTargetClass上设置任何注释来强制执行所需的属性吗?例如,如果我有一个属性为ABC、DEF和GHI的JSON对象,我的JSON如下 我希望它以某种方式失败,并且只有在readValue上成功,如果它包含ABC、DEF和GHI。