我有一个Collection<Event>
。 Event
看起来像这样
public class Event {
private Integer id;
private LocalDateTime localDateTime;
// getters, setters omitted
}
Event
中的每个Collection
必须具有唯一的id
和localDateTime
。我该如何使用流API进行检查并在满足条件的情况下返回true?
答案 0 :(得分:1)
这是您需要的Event
类;
class Event {
private Integer id;
private LocalDateTime localDateTime;
public Integer getId() {
return id;
}
public LocalDateTime getLocalDateTime() {
return localDateTime;
}
public void setId(Integer id) {
this.id = id;
}
public void setLocalDateTime(LocalDateTime localDateTime) {
this.localDateTime = localDateTime;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Event event = (Event) o;
return id.equals(event.id) &&
localDateTime.equals(event.localDateTime);
}
@Override
public int hashCode() {
return Objects.hash(id, localDateTime);
}
public static boolean hasDuplicates(List<Event> events) {
/*
return events
.stream()
.noneMatch(e -> events
.stream()
.filter(ev -> ev.equals(e)).count() > 1);
*/
return events.stream()
.distinct()
.count() != events.size(); // Kudos to @Holger for this approach.
}
}
此hasDuplicates
是一个static
函数,因此不会对您的对象创建产生任何影响。您可以将其用作检查重复项的实用方法。您只需要单行检查即可。
答案 1 :(得分:0)
首先,覆盖方法equals()
和hashcode()
并按如下方式编写:
@Override
public boolean equals(Object o){
if (o instanceof Event){
Event e = (Event) o;
return e.id.equals(this.id) && e.localDateTime.equals(this.localDateTime);
}
else return false;
}
@Override
public int hashCode(){
return Objects.hash(id,localDateTime); //this is the default implementation, up to you to implement it in a better way
}
然后,您可以使用像这样的流来检查是否存在重复项:
public boolean checkAllUnique(Collection<Event> col){
return col.stream().allMatch(new HashSet<>()::add);
}
答案 2 :(得分:-1)
import java.util.concurrent.atomic.AtomicInteger;
public class Event {
private static final AtomicInteger idGenerator = new AtomicInteger(1000);
private Integer id;
private LocalDateTime localDateTime;
public Event(){
id = idGenerator.getAndIncrement();
}
// getters, setters omitted
}
代码测试
public class Test {
public static void main(String[] args) {
for(int i = 0; i < 10; ++ i){
System.out.println(new Event().getId());
}
}
}
输出
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
答案 3 :(得分:-2)
您可以使用两个HashSet
作为后备集合来存储唯一元素,并按以下方式遍历事件列表:
public boolean duplicateExists(List<Event> eventList) {
Set<Integer> ids = new HashSet<>();
Set<LocalDateTime> localDateTimes = new HashSet<>();
return eventList.stream()
.anyMatch(event -> !ids.add(event.getId()) ||
!localDateTimes.add(event.getLocalDateTime()));
}