抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Java和Go具体代码的使用

Java之List去重

有时业务场景需要针对一个 List 中的数据进行去重

如果是根据类对象去重可能还好,甚至不用重写 hashCode()方法和 equals()方法;

但是如果对对象中某个成员变量去重,就稍显麻烦,这时候可以借助 java8 的特性来去重

例如下语句,实现 users列表 中针对 name属性 去重,得到新的不含 name重复项 的 deleteRepeatUsers 列表

1
2
3
4
5
6
7
List<Problem> deleteRepeatUsers = users.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(
Comparator.comparing(User::getName))),
ArrayList::new)
);

其中:

  • .stream()users 转换为一个流,后续使用流操作处理
  • .collect().Collectors.toCollection() 都用于将流中元素收集到一个集合(Collection)中,后者返回一个收集器(Collect)
  • Collectors.collectingAndThen()包装另一个收集器,用于在使用其他收集器收集数据后对产生一个最终的结果(中转站)
  • () -> new TreeSet<>(Comparator.comparing(User::getName))是一个Lambda表达式,表示一个无参构造函数的引用:创建一个新的TreeSet对象,并传递一个Comparator,通过User:getName方法引用定义排序(过滤)规则

综上,users转换成流收集后,数据经过TreeSet去重再转换回ArrayList容器

Go之make()函数

make(type, len, cap)

  • type : 数据类型
  • len : 实际占用空间
  • cap : 预留空间

内存分配: 先是只会去用len的空间,如果空间不够,再去拿cap的空间,这样避免了二次内存分配,提高效率。如果cap的空间或者在未指定cap的情况下len的空间满了,就会再进行动态内存分配策略,再去申请当前内存的相同空间,于是内存变为两倍

评论