java8 List常用功能:元素去重、快速打印、按size拆分

Stream操作的一个比较好的习惯,在构建流之后,要进行filter操作,从中滤除有问题的数据,比如空、null或者非数值类型等,避免后续的map等操作中直接报错。

参考

https://segmentfault.com/a/1190000023914939

去重

https://juejin.cn/post/6844903842132262926
方法二针对Object的时候需要指定属性,否则无法使用distinct

// 1
List<String> newList = new ArrayList<>(new HashSet<>(list));
// 2
// 使用了 Lombok 插件的 @Data注解,可自动覆写 equals() 以及 hashCode() 方法。
List<String> newList = list.stream().distinct().collect(Collectors.toList());
// 3:利用set,指定Object的某个属性
Set<Player> playerSet = new TreeSet<>(Comparator.comparing(Player::getName));
playerSet.addAll(playerList); 
List list = set.stream().collect(toList());
// 4:利用set
List<Player> newList = playerList.stream().collect(Collectors
          .collectingAndThen(
                  Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Player::getName))),
                  ArrayList::new));
// 5:谓词
void testRemove7() {
  List<Player> newList = new ArrayList<>();
  playerList.stream().filter(distinctByKey(p -> p.getName()))  //filter保留true的值
          .forEach(newList::add);

  newList.forEach(System.out::println);
}

static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
  Map<Object,Boolean> seen = new ConcurrentHashMap<>();
  //putIfAbsent方法添加键值对,如果map集合中没有该key对应的值,则直接添加,并返回null,如果已经存在对应的值,则依旧为原来的值。
  //如果返回null表示添加数据成功(不重复),不重复(null==null :TRUE)
  return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

快速打印

// 数组
System.out.println(Arrays.toString(array));
// Liss
System.out.println(Arrays.toString(list.toArray()));

// 使用StringJoiner
List<String> list = Arrays.asList("java", "python", "nodejs", "ruby");
//java, python, nodejs, ruby
String result = String.join(", ", list);

List<String> list = Arrays.asList("java", "python", "nodejs", "ruby");
//java | python | nodejs | ruby
String result = list.stream().map(x -> x).collect(Collectors.joining(" | "));

List<Game> list = Arrays.asList(
                new Game("Dragon Blaze", 5),
                new Game("Angry Bird", 5),
                new Game("Candy Crush", 5)
        );

//{Dragon Blaze, Angry Bird, Candy Crush}
String result = list.stream().map(x -> x.getName())
            .collect(Collectors.joining(", ", "{", "}"));

按照size拆分为List

将list集合按指定长度进行切分,返回新的List<List<??>>集合,如下的:

List<List> lists=Lists.partition(numList,1000);

常见用途:多线程任务分发

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值