「Java 开发实例」Java8 实现对象集合去重

107 阅读1分钟

废话不多说系列,直接上核心代码!!!

美女2.png

(1)核心代码

/**
 * 数据流去重方法(如果多个参数,使用添加即可)
 * @param keyExtractor 去重标识
 * @param <T> 对象
 * @return 去重唯一的对象
 */
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
    Map<Object,Boolean> seen = new ConcurrentHashMap<>(16);
    return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

// 使用方法,如下:
// 数据去重 利用原理 map去重
List noRepeatList = bookList.stream().filter(distinctByKey(Book::getName)).collect(Collectors.toList());

(2)结果演示

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class Java8Util {

    public static void main(String[] args) {
        // 数据去重 利用原理 map去重
        List<Book> bookList = Lists.newArrayList(
                Book.builder().name("one").build(),
                Book.builder().name("one").build(),
                Book.builder().name("tow").build()
        );
        List noRepeatList = bookList.stream().filter(distinctByKey(Book::getName)).collect(Collectors.toList());
        noRepeatList.stream().forEach(System.out::println);
    }

    // 去重封装函数
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

}

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
class Book {
    private String name;
    private String author;
    private BigDecimal price;
    private Date date;
}

结果展示:

image.png

(3)集合去重方案

总览:

  1. 如果是基本数据类型:利用 set 和 java8中的distinct() 去重;
  2. 如果是引用类型:
    • 如果是集合中存在相同对象的集合去重,则此时需要引入 Lombok 注解@Data 在实体类上快速覆写equals和hashcode方法,方才可快速去重相同的对象的目的;
    • 如果是按照某一相同属性对集合对象去重,则按上述方法使用即可;
  3. 相关文章:juejin.cn/post/684490…

至此,感谢阅读!🙏

美女2.png