Java 8按属性区分

Java 8按属性区分

在Java 8中,如何使用Stream通过检查每个对象的属性的区别性来实现API?

例如,我有一个列表Person对象,并且我想删除同名的人,

persons.stream().distinct();

将使用默认的等式检查。Person所以我需要类似的东西,

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

不幸的是distinct()方法没有这样的重载。中不修改相等检查。Person类可以简洁地做到这一点吗?


米琪卡哇伊
浏览 389回答 3
3回答

largeQ

考虑distinct成为状态过滤器..下面是一个函数,它返回一个谓词,该谓词维护以前看到的内容的状态,并返回给定元素是否第一次被看到:public&nbsp;static&nbsp;<T>&nbsp;Predicate<T>&nbsp;distinctByKey(Function<?&nbsp;super&nbsp;T,&nbsp;?>&nbsp;keyExtractor)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Set<Object>&nbsp;seen&nbsp;=&nbsp;ConcurrentHashMap.newKeySet(); &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;t&nbsp;->&nbsp;seen.add(keyExtractor.apply(t));}然后你可以写:persons.stream().filter(distinctByKey(Person::getName))注意,如果流被排序并行运行,这将保留任意元素中的元素,而不是第一个副本中的distinct()的确如此。(这与我的回答关于这个问题:JavaLambdaStream对任意键的区分()?)

犯罪嫌疑人X

另一种办法是把这些人放在地图上,用名字作为钥匙:persons.collect(toMap(Person::getName,&nbsp;p&nbsp;->&nbsp;p,&nbsp;(p,&nbsp;q)&nbsp;->&nbsp;p)).values();注意,在重复姓名的情况下,被保留的人将是第一个被授权的人。

翻翻过去那场雪

您可以将Person对象包装到另一个类中,该类只比较人员的名称。之后,您将打开包装好的对象以再次获得Person流。流操作可能如下所示:persons.stream() &nbsp;&nbsp;&nbsp;&nbsp;.map(Wrapper::new) &nbsp;&nbsp;&nbsp;&nbsp;.distinct() &nbsp;&nbsp;&nbsp;&nbsp;.map(Wrapper::unwrap) &nbsp;&nbsp;&nbsp;&nbsp;...;全班Wrapper如下所示:class&nbsp;Wrapper&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;Person&nbsp;person; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Wrapper(Person&nbsp;person)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.person&nbsp;=&nbsp;person; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Person&nbsp;unwrap()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;person; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;equals(Object&nbsp;other)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(other&nbsp;instanceof&nbsp;Wrapper)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((Wrapper)&nbsp;other).person.getName().equals(person.getName()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;hashCode()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;person.getName().hashCode(); &nbsp;&nbsp;&nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java