如果Java集合包含两个相同的元素,如何返回false

时间:2019-06-11 07:56:11

标签: java java-stream

我有一个Collection<Event>Event看起来像这样

public class Event {

   private Integer id;
   private LocalDateTime localDateTime;

   // getters, setters omitted

}

Event中的每个Collection必须具有唯一的idlocalDateTime。我该如何使用流API进行检查并在满足条件的情况下返回true?

4 个答案:

答案 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()));
}