java收集器Collector案例匯總
一、收集器Collector
//T:表示流中每個元素的類型。 A:表示中間結果容器的類型。 R:表示最終返回的結果類型。
public interface Collector<T, A, R> {
? ? Supplier<A> supplier()//生成容器
?? ?BiConsumer<A,T>?? ?accumulator()//是添加元素
?? ?BinaryOperator<A> combiner()//是合并容器
?? ?Function<A,R>finisher()///是輸出的結果
?? ?Set<Collector.Characteristics>?? ?characteristics()//返回Set的Collector.Characteristics指示此收集器的特征。
?? ?//返回一個新的Collector由給定的描述supplier, accumulator,combiner,和finisher功能。
?? ?static <T,A,R> Collector<T,A,R> of(Supplier<A> supplier,?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?BiConsumer<A,T> accumulator,
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?BinaryOperator<A> combiner,
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?Function<A,R> finisher,
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?Collector.Characteristics... characteristics)
?? ?//返回一個新的Collector由給定的描述supplier, accumulator和combiner功能。
?? ?static <T,R> Collector<T,R,R>?? ?of(Supplier<R> supplier,?
?? ??? ??? ??? ??? ??? ??? ??? ??? ? ? BiConsumer<R,T> accumulator,?
?? ??? ??? ??? ??? ??? ??? ??? ??? ? ? BinaryOperator<R> combiner,?
?? ??? ??? ??? ??? ??? ??? ??? ??? ? ? Collector.Characteristics... characteristics)
}二、收集器工廠Collectors
public final class Collectors extends Object
Collectors作為Stream的collect方法的參數(shù),Collector是一個接口,它是一個可變的匯聚操作,將輸入元素累計到一個可變的結果容器中;它會在所有元素都處理完畢后,將累積的結果轉(zhuǎn)換為一個最終的表示(這是一個可選操作);
Collectors本身提供了關于Collector的常見匯聚實現(xiàn),Collectors的內(nèi)部類CollectorImpl實現(xiàn)了Collector接口,Collectors本身實際上是一個
工廠。
2.1 變成ConcurrentMap
//返回將Collector元素累積到其中 ConcurrentMap的并發(fā)函數(shù),其鍵和值是將提供的映射函數(shù)應用于輸入元素的結果。 static <T,K,U> Collector<T,?,ConcurrentMap<K,U>>?? ?toConcurrentMap(Function<? super T,? extends K> keyMapper,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?Function<? super T,? extends U> valueMapper) //返回將Collector元素累積到其中 ConcurrentMap的并發(fā)函數(shù),其鍵和值是將提供的映射函數(shù)應用于輸入元素的結果。 static <T,K,U> Collector<T,?,ConcurrentMap<K,U>>?? ?toConcurrentMap(Function<? super T,? extends K> keyMapper,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?Function<? super T,? extends U> valueMapper,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?BinaryOperator<U> mergeFunction) //返回將Collector元素累積到其中 ConcurrentMap的并發(fā)函數(shù),其鍵和值是將提供的映射函數(shù)應用于輸入元素的結果。 static <T,K,U,M extends ConcurrentMap<K,U>> Collector<T,?,M> ? ?toConcurrentMap( ? ? ? ? ? ? ? ? ? ? ? ? ? ? Function<? super T,? extends K> keyMapper,? ?? ??? ??? ??? ??? ??? ??? ?Function<? super T,? extends U> valueMapper,? ?? ??? ??? ??? ??? ??? ??? ?BinaryOperator<U> mergeFunction,? ?? ??? ??? ??? ??? ??? ??? ?Supplier<M> mapSupplier ?? ??? ??? ??? ??? ? )
2.2 變成Map
static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Function<? super T,? extends U> valueMapper) //1、當key重復時,會拋出異常:java.lang.IllegalStateException: Duplicate key? //2、當value為null時,會拋出異常:java.lang.NullPointerException
案例:
List<Person>integerList=newArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("f",2));
Mapmap=integerList.stream().collect(Collectors.toMap(Person::getName,Person::getAge));
System.out.println(map);//{a=3, b=3, c=3, d=2, e=2, f=2}
//第三個參數(shù)用在key值沖突的情況下:如果新元素產(chǎn)生的key在Map中已經(jīng)出現(xiàn)過了,第三個參數(shù)就會定義解決的辦法。 static <T,K,U> Collector<T,?,Map<K,U>> toMap( ?Function<? super T,? extends K> keyMapper,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? Function<? super T,? extends U> valueMapper,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? BinaryOperator<U> mergeFunction)
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("e",3));
Collections.sort(integerList,comparator);
System.out.println(integerList);*/
Map map =integerList.stream().collect(Collectors.toMap(Person::getName,Person::getAge,(a,b)->a+b));
System.out.println(map);//{a=3, b=3, c=3, d=2, e=5}//返回將Collector元素累積到 Map其鍵中的值,其值是將提供的映射函數(shù)應用于輸入元素的結果。 static <T,K,U,M extends Map<K,U>> Collector<T,?,M> ?toMap( Function<? super T,? extends K> keyMapper,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?Function<? super T,? extends U> valueMapper,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?BinaryOperator<U> mergeFunction,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?Supplier<M> mapSupplier)
2.3 變成Collection
static <T> Collector<T,?,List<T>> toList() static <T> Collector<T,?,Set<T>> ?toSet() ? //自定義? static <T,C extends Collection<T>> ?Collector<T,?,C> ?toCollection(Supplier<C> collectionFactory)
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("e",3));
List<Integer> list= integerList.stream().map(Person::getAge).collect(Collectors.toList());
System.out.println(list);//[3, 3, 3, 2, 2, 3]
System.out.println(list.getClass());//class java.util.ArrayList
Set<Integer>set=integerList.stream().map(Person::getAge).collect(Collectors.toSet());
System.out.println(set);//[2, 3]
System.out.println(set.getClass());//class java.util.HashSet
LinkedList<Integer>linkedList=integerList.stream().map(Person::getAge).collect(Collectors.toCollection(LinkedList::new));
System.out.println(linkedList);//[3, 3, 3, 2, 2, 3]
System.out.println(linkedList.getClass());//class java.util.LinkedList2.4 變成String
static Collector<CharSequence,?,String>?? ?joining() //delimiter分隔符連接 static Collector<CharSequence,?,String>?? ?joining(CharSequence delimiter)? //prefix前綴 //suffix后綴 static Collector<CharSequence,?,String>?? ?joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
案例:
List<Person> integerList = newArrayList<>();
integerList.add(new Person("a",3));
integerList.add(new Person("b",3));
integerList.add(new Person("c",3));
integerList.add(new Person("d",2));
integerList.add(new Person("e",2));
integerList.add(new Person("e",3));
Stringlist = integerList.stream().map(Person::getName).collect(Collectors.joining());
System.out.println(list);//abcdee
Stringset = integerList.stream().map(Person::getName).collect(Collectors.joining(","));
System.out.println(set);//a,b,c,d,e,e
StringlinkedList = integerList.stream().map(Person::getName).collect(Collectors.joining(",","(",")"));
System.out.println(linkedList);//(a,b,c,d,e,e)2.5 計算最值
static <T> Collector<T,?,Optional<T>> ?maxBy(Comparator<? super T> comparator)? static <T> Collector<T,?,Optional<T>> ?minBy(Comparator<? super T> comparator)
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",2));
integerList.add(new Person("c",3));
integerList.add(new Person("d",4));
integerList.add(new Person("e",5));
integerList.add(new Person("e",6));
Optional<Person> person = integerList.stream().collect(Collectors.maxBy(Comparator.comparing(Person::getAge)));
System.out.println(person.get());//Person{name='e',age='6'}2.6 平均值
static <T> Collector<T,?,Double> averagingDouble(ToDoubleFunction<? super T> mapper) static <T> Collector<T,?,Double> averagingInt(ToIntFunction<? super T> mapper) static <T> Collector<T,?,Double> averagingLong(ToLongFunction<? super T> mapper)
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",1));
integerList.add(new Person("c",1));
integerList.add(new Person("d",1));
integerList.add(new Person("e",1));
integerList.add(new Person("e",1));
double number=integerList.stream().collect(Collectors.averagingDouble(Person::getAge));
System.out.println(number);//1.02.7 統(tǒng)計數(shù)據(jù)
static <T> Collector<T,?,DoubleSummaryStatistics> summarizingDouble(ToDoubleFunction<? super T> mapper) static <T> Collector<T,?,IntSummaryStatistics>?? ? summarizingInt(ToIntFunction<? super T> mapper)? static <T> Collector<T,?,LongSummaryStatistics> summarizingLong(ToLongFunction<? super T> mapper)
DoubleSummaryStatistics,IntSummaryStatistics,LongSummaryStatistics 用于收集統(tǒng)計數(shù)據(jù)(如計數(shù),最小值,最大值,總和和平均值)的狀態(tài)對象。
此實現(xiàn)不是線程安全的。但是,Collectors.toXXXStatistics()在并行流上使用是安全的 ,因為并行實現(xiàn)Stream.collect() 提供了必要的分區(qū),隔離和合并結果,以實現(xiàn)安全有效的并行執(zhí)行。
他們的方法如下:
void accept(int value)//添加一個值 void combine(IntSummaryStatistics other)//將另一個的狀態(tài)合并IntSummaryStatistics到這個狀態(tài)中。 double getAverage()//算術平均值,如果沒有記錄值,則返回零。 long getCount()//返回記錄的值的計數(shù)。 int getMax()//返回記錄的最大值,或者Integer.MIN_VALUE沒有記錄值。 int getMin()//返回記錄的最小值,或者Integer.MAX_VALUE沒有記錄值。 long getSum()//返回記錄的值的總和,如果沒有記錄值,則返回零。 String toString()//返回對象的字符串表示形式。
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",2));
integerList.add(new Person("c",3));
integerList.add(new Person("d",4));
integerList.add(new Person("e",5));
integerList.add(new Person("e",6));
DoubleSummaryStatistics number = integerList.stream().collect(Collectors.summarizingDouble(Person::getAge));
System.out.println(number.getMax());//6
System.out.println(number.getMin());//1.0
System.out.println(number.getSum());//21.0
System.out.println(number.getAverage());//3.5
number.accept(100);
System.out.println(number.getMax());//100.02.8 求和
static <T> Collector<T,?,Double> summingDouble(ToDoubleFunction<? super T> mapper)?? ? static <T> Collector<T,?,Integer> summingInt(ToIntFunction<? super T> mapper)?? ? static <T> Collector<T,?,Long>?? ?summingLong(ToLongFunction<? super T> mapper)
2.9 reducing函數(shù)
//op 縮減的函數(shù) static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op) ?? ? //identity儲存器初始值 static <T> Collector<T,?,T> reducing(T identity, BinaryOperator<T> op) //mapper作用的數(shù)值 static <T,U> Collector<T,?,U>?? ?reducing(U identity, Function<? super T,? extends U> mapper, BinaryOperator<U> op)
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("b",0));
integerList.add(new Person("c",0));
integerList.add(new Person("d",0));
integerList.add(new Person("e",0));
integerList.add(new Person("e",0));
Integernumber = integerList.stream().collect(Collectors.reducing(1,Person::getAge,(a,b)->a+b));
System.out.println(number);//22.10 計數(shù)
//返回Collector類型的接受元素,T用于計算輸入元素的數(shù)量。 static <T> Collector<T,?,Long>?? ?counting()
2.11 分組-變成map
//classifier分組依據(jù)函數(shù) static <T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier)
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("a",2));
integerList.add(new Person("a",3));
integerList.add(new Person("b",4));
integerList.add(new Person("b",5));
integerList.add(new Person("b",6));
?? ?
Map map =i ntegerList.stream().collect(Collectors.groupingBy(Person::getName));
System.out.println(map);
{
a=[Person{name='a', age='1'}, Person{name='a', age='2'}, Person{name='a', age='3'}],?
b=[Person{name='b', age='4'}, Person{name='b', age='5'}, Person{name='b', age='6'}]
}//downstream將小組內(nèi)對象進行處理 static <T,K,A,D> Collector<T,?,Map<K,D>>?? ?groupingBy(Function<? super T,? extends K> classifier,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Collector<? super T,A,D> downstream) //mapFactory中間操作 static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M> ?groupingBy(Function<? super T,? extends K> classifier,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? Supplier<M> mapFactory,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? Collector<? super T,A,D> downstream)
案例:
List<Person> integerList = newArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("a",2));
integerList.add(new Person("a",3));
integerList.add(new Person("b",4));
integerList.add(new Person("b",5));
integerList.add(new Person("b",6));
Map map= i ntegerList.stream()
? ? ? ? ? ? ? ? ? ? .collect(Collectors.groupingBy(Person::getName,Collectors.reducing(0,Person::getAge,(a,b)->a+b)));
System.out.println(map);//{a=6, b=15}
Map map = integerList.stream()
? ? ? ? ? ? ? ? ? ? .collect(Collectors.groupingBy(Person::getName,TreeMap::new,Collectors.reducing(0,Person::getAge,(a,b)->a+b)));
System.out.println(map.getClass());//classjava.util.TreeMap2.12 分組-變成ConcurrentMap
static <T,K> Collector<T,?,ConcurrentMap<K,List<T>>>?? ?groupingByConcurrent(Function<? super T,? extends K> classifier) static <T,K,A,D> Collector<T,?,ConcurrentMap<K,D>>?? ?groupingByConcurrent(Function<? super T,? extends K> classifier,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? Collector<? super T,A,D> downstream) static <T,K,A,D,M extends ConcurrentMap<K,D>> Collector<T,?,M> groupingByConcurrent(Function<? super T,? extends K> classifier,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? Supplier<M> mapFactory,? ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? Collector<? super T,A,D> downstream)
2.13 分割流
//predicate分區(qū)的依據(jù) static <T> Collector<T,?,Map<Boolean,List<T>>>?? ? partitioningBy(Predicate<? super T> predicate) static <T,D,A> Collector<T,?,Map<Boolean,D>>?? ?partitioningBy(Predicate<? super T> predicate, Collector<? super T,A,D> downstream)
2.14 收集器
通過在累積之前將映射函數(shù)應用于每個輸入Collector元素,使類型的接受元素適應一個接受類型的U元素T。
static <T,U,A,R> Collector<T,?,R>?? ?mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
案例:
List<Person> integerList = new ArrayList<>();
integerList.add(new Person("a",1));
integerList.add(new Person("a",2));
integerList.add(new Person("a",3));
integerList.add(new Person("b",4));
integerList.add(new Person("b",5));
integerList.add(new Person("b",6));
List list = integerList.stream().collect(Collectors.mapping(Person::getName,Collectors.toList()));
System.out.println(list);//[a, a, a, b, b, b]2.15 收集之后繼續(xù)做一些處理
static <T,A,R,RR> Collector<T,A,RR>?? ?collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)
到此這篇關于java收集器Collector詳情的文章就介紹到這了,更多相關java收集器 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟記錄
這篇文章主要給大家介紹了關于IDEA2020.2.3中創(chuàng)建JavaWeb工程的完整步驟,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
Java8中LocalDateTime與時間戳timestamp的互相轉(zhuǎn)換
這篇文章主要給大家介紹了關于Java8中LocalDateTime與時間戳timestamp的互相轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-03-03
Java中使用JWT生成Token進行接口鑒權實現(xiàn)方法
這篇文章主要介紹了Java中使用JWT生成Token進行接口鑒權實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08

