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);// 过滤,只保留 bCollectionUtils.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);}@Configurationpublic class CacheConfiguration {@Beanpublic 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

