用法一:倒序排列集合,获取最大值
private static Comparator<Integer> comparator = (i1,i2) -> Integer.compare(i2,i1);
private static Function<FeiJiDetai,Integer> keyExtractor = feiJiDetai -> feiJiDetai.getCount();
FeiJiDetai feiJiDetai= feiJiDetaiList.stream()
.sorted(Comparator.comparing(keyExtractor,comparator))//倒序排列,按照count关键字
.findFirst()
.get();//获取最长的飞机
流stream与集合不同,它不会持有值,它的目的是处理值,创建流不会导致数据流动。
用法二:把集合转换为map
List<Integer> pokers = Arrays.asList(4,22,1,34,37,2,1,51,6);
//将nums转换为一个map,key为值,value为数量
Map<Integer,Integer> cards = pokers.stream()
.map(POCKER_TO_NUM)//获得手牌的 转换值 3-15,K=13, A=14,2=15
.collect(Collectors.toMap(k->k, k->1,(oldV, newV)->oldV+newV , TreeMap::new));
System.out.println(cards);
toMap参数:k,v,出现相同k时的处理策略,创建的map
用法三:把一个list类型的集合 “根据指定条件” 分成2个,存储在map中
下面是把i<9的分成一个list,剩下的在一个List中
Map<Boolean,List<Integer>> r = pokers.stream().collect(Collectors.partitioningBy( i-> i<9 ));
用法四:根据指定的属性对集合分组
根据book的pageCount分类,相同页数的书分类在一起
Map<Integer ,List<Book>> gbs = books.stream().collect(Collectors.groupingBy(Book::getPageCount));
用法五:获取相同标题的书中,最厚的那一本
第二个收集器,是对一个group中的list进行的二次收集
Map<String ,Optional<Book>> gbs = books.stream().collect(Collectors.groupingBy(Book::getTitle,Collectors.maxBy(Comparator.comparing(b->b.getPageCount()))));
用法六:将map转换为list
TreeMap<Integer,Integer> cards =new TreeMap<>();
cards.put(6,2);
cards.put(2,3);
cards.put(7,4);
cards.put(9,1);
List<Integer> integerList = cards.entrySet().stream().collect(Collector.of(ArrayList::new, (list, eo) -> {
for (int i = 0; i < eo.getValue(); i++) {
list.add(eo.getKey());
}
}, (left, right) -> {
left.addAll(right);
return left;
}));//将map转换为list
System.out.println(integerList);
flatmap
sorted
distinct
peek
skip
limit
终止管道
搜索操作
anyMatch
allMatch
noneMatch
findAny
findFirst
汇聚操作
sum
min
max
count
average
summaryStatistics(包含以上所有汇聚信息)
收集流
toSet,toList
Collectors.joining()
Collectors.joining(chars) 使用指定字符串连接所有字符串
Collectors.joining(c,c,c)使用指定字符串分割,并对所有内容加前缀和后缀