废话不多说系列,直接上核心代码!!!
(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;
}
结果展示:
(3)集合去重方案
总览:
- 如果是基本数据类型:利用 set 和 java8中的distinct() 去重;
- 如果是引用类型:
- 如果是集合中存在相同对象的集合去重,则此时需要引入 Lombok 注解@Data 在实体类上快速覆写equals和hashcode方法,方才可快速去重相同的对象的目的;
- 如果是按照某一相同属性对集合对象去重,则按上述方法使用即可;
- 相关文章:juejin.cn/post/684490…
至此,感谢阅读!🙏