如何使用Java8删除重复列表

时间:2018-03-09 00:08:53

标签: java java-8 java-stream

enter image description here

上表中有四条记录;如何获得具有唯一ID的结果,并使用Java 8流按创建时间排序最新记录。

在这个例子中;我想只看到两个这样的记录:

6838322 45210 2018-03-08 06:07 

6838320 45209 2018-03-08 05:50

2 个答案:

答案 0 :(得分:1)

yourObjects.stream()
           .collect(Collectors.toMap(
               YourObject::getId,
               YourObject::getCreationTime,
               BinaryOperator.maxBy(Comparator.comparing(Function.identity())
))

其中YourObject实际上是您拥有的java中的对象,getCreationTime会返回Date Comparable

答案 1 :(得分:-1)

您可以按创建时间对流进行排序,并在id上应用记录的相等性(以便您可以使用distinct)。以下是代码:

public class StreamStuff {
    public static void main(String[] args) {
        List<Data> datas = Arrays.asList(new Data(6838322, new Date()), new Data(6838320, new Date(1520574131111L)),
                new Data(6838320, new Date(1520574136940L)), new Data(6838320, new Date(324324353999L)));

        datas.stream()
            .sorted((d1, d2) -> d2.creationTime.compareTo(d1.creationTime))
            .distinct()
            .forEach(System.out::println);
    }

}

class Data {
    int id;
    Date creationTime;
    public Data(int id, Date creationTime) {
        super();
        this.id = id;
        this.creationTime = creationTime;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Data other = (Data) obj;
        if (id != other.id)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Data [id=" + id + ", creationTime=" + creationTime + "]";
    }

}