1. 程式人生 > >java8 Stream 一行實現列表去重

java8 Stream 一行實現列表去重

通常情況下,實現列表去重的方式有:

  1. 建立一個新的result列表,迴圈原列表,如果元素不在result列表中,則放入
  2. 建立一個HashSet,將列表作為構造引數傳入

下面介紹一種簡單、高效的去重方式,藉助於java8新特性引入的Stream類。程式碼如下:

實體類Person,如果id,name都相同,認為兩個Person相同

package entity;

import java.util.Objects;

import lombok.Data;

@Data
public class Person {
  private Integer id;
  private String name;

  public Person(Integer id, String name) {
    this.id = id;
    this.name = name;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return Objects.equals(id, person.id) &&
      Objects.equals(name, person.name);
  }

  @Override
  public int hashCode() {

    return Objects.hash(id, name);
  }
}

測試用例

import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import entity.Person;

public class TestJava8 {
  public static void main(String[] args) {
    testCollectors();
  }

  static void testCollectors() {
    System.out.println(Stream.of(1, 2, 3, 1, 2).distinct().collect(Collectors.toList()));
    Person p1 = new Person(1, "a");
    Person p2 = new Person(2, "b");
    Person p3 = new Person(3, "a");
    Person p4 = new Person(1, "c");
    Person p5 = new Person(1, "a");
//將list轉換為Stream,呼叫distinct方法,然後再講Stream轉換為list
    System.out.println(Stream.of(p1, p2, p3, p4).distinct().collect(Collectors.toList()));
//輸出結果為:[Person(id=1, name=a), Person(id=2, name=b), Person(id=3, name=a), Person(id=1, name=c)]
  }
}