Collections方法
get, add, addAll, sort, contains, containsAll, remove, removeAll,clear, subList,retainAll
Collections 工具类
- org.springframework.util.CollectionUtils
- Java 中节省 90% 时间的常用的工具类——apache.commons.collections4.CollectionUtils
这是一个工具类,可以检查 null 元素不被加入集合,合并列表,过滤列表,两个列表的并集、差集、合集。有部分功能在 Java 8 中可以被 Stream API 替换。
public static void main(String[] args) {
//null 元素不能加进去
List<String> arrayList1 = new ArrayList<>();
arrayList1.add("a");
CollectionUtils.addIgnoreNull(arrayList1, null);
System.out.println(arrayList1.size());
//排好序的集合,合并后还是排序的
List<String> arrayList2 = new ArrayList<>();
arrayList2.add("a");
arrayList2.add("b");
List<String> arrayList3 = new ArrayList<>();
arrayList3.add("c");
arrayList3.add("d");
System.out.println("arrayList3:" + arrayList3);
List<String> arrayList4 = CollectionUtils.collate(arrayList2, arrayList3);
System.out.println("arrayList4:" + arrayList4);
//交集
Collection<String> strings = CollectionUtils.retainAll(arrayList4, arrayList3);
System.out.println("arrayList3和arrayList4的交集:" + strings);
//并集
Collection<String> union = CollectionUtils.union(arrayList4, arrayList3);
System.out.println("arrayList3和arrayList4的并集:" + union);
//差集
Collection<String> subtract = CollectionUtils.subtract(arrayList4, arrayList3);
System.out.println("arrayList3和arrayList4的差集:" + subtract);
// 过滤,只保留 b
CollectionUtils.filter(arrayList4, s -> s.equals("b"));
System.out.println(arrayList4);
}
排序操作
//反转
void reverse(List list)
//随机排序
void shuffle(List list)
//按自然排序的升序排序
void sort(List list)
//定制排序,由Comparator控制排序逻辑
void sort(List list, Comparator c)
//交换两个索引位置的元素
void swap(List list, int i , int j)
//旋转。当distance为正数时,将list后distance个元素整体移到前面。
// 当distance为负数时,将 list的前distance个元素整体移到后面
void rotate(List list, int distance)
查找,替换操作
//对List进行二分查找,返回索引,注意List必须是有序的
int binarySearch(List list, Object key)
//根据元素的自然顺序,返回最大的元素。
// 类比int min(Collection coll)
int max(Collection coll)
//根据定制排序,返回最大元素,排序规则由Comparatator类控制。
//类比int min(Collection coll, Comparator c)
int max(Collection coll, Comparator c)
//用指定的元素代替指定list中的所有元素
void fill(List list, Object obj)
//统计元素出现次数
int frequency(Collection c, Object o)
//统计target在list中第一次出现的索引,找不到则返回-1,
//类比int lastIndexOfSubList(List source, list target)
int indexOfSubList(List list, List target)
//用新元素替换旧元素
boolean replaceAll(List list, Object oldVal, Object newVal)
Collectors
toMap
value为null的bug: NullPointerException in Collectors.toMap with null entry values
Map<String, Double> rawTypes = resolver.aiNicks().stream()
.collect(Collectors.toMap(t -> t, t -> possibility(possibilities, t)));
groupingBy
personInfoList.stream().collect(
Collectors.groupingBy(
PersonInfo::getSex, LinkedHashMap::new, Collectors.toList()));
stream
- Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
- [译] 一文带你玩转 Java8 Stream 流,从此操作集合 So Easy
[ ] 8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理
lambda表达式
-
函数式接口
@FunctionalInterface
Predicate,Consumer JDK 中定义了很多函数式接口,主要在 java.util.function包下,还有 java.util.Comparator 专门用作定制比较器。另外,前面说的 Runnable也是一个函数式接口。
Lambda结合FunctionalInterface Lib, forEach, stream(),method reference等新特性可以使代码变的更加简洁! stream()的几个方法都是接受Predicate
,Consumer 等参数的
public interface CacheExpireConfigurer {
void customize(CacheExpires cacheExpires);
}
@Configuration
public class CacheConfiguration {
@Bean
public CacheExpireConfigurer cacheExpireConfigurer() {
return cacheExpires -> {
cacheExpires.put("Cache name", 60);
};
}
}
Paralle
-
Lists.partition(lists, BATCH_SIZE)
.parallelStream()
.flatMap()
flatMap
private Set<Long> collectFamilyNodes(List<TblMenu> nodes, List<TblMenu> allMenus) {
return nodes.stream()
.map(node -> composeFamilyTree(node, allMenus))
.flatMap(Collection::stream)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
public List<AssetVo> groupByLocNo(List<HyveAssetDto> hyveAssetDtos) {
List<HyveAssetItemDto> hyveAssetItems = dtos.stream()
.flatMap(dto -> dto.getItems().stream())
.collect(Collectors.toList());
}
sum