首頁 > 軟體

java收集器Collector案例彙總

2022-06-09 22:02:28

一、收集器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方法的引數,Collector是一個介面,它是一個可變的匯聚操作,將輸入元素累計到一個可變的結果容器中;它會在所有元素都處理完畢後,將累積的結果轉換為一個最終的表示(這是一個可選操作);

Collectors本身提供了關於Collector的常見匯聚實現,Collectors的內部類CollectorImpl實現了Collector介面,Collectors本身實際上是一個
工廠。

2.1 變成ConcurrentMap

//返回將Collector元素累積到其中 ConcurrentMap的並行函數,其鍵和值是將提供的對映函數應用於輸入元素的結果。
static <T,K,U> Collector<T,?,ConcurrentMap<K,U>>    toConcurrentMap(Function<? super T,? extends K> keyMapper, 
                                                                      Function<? super T,? extends U> valueMapper)

//返回將Collector元素累積到其中 ConcurrentMap的並行函數,其鍵和值是將提供的對映函數應用於輸入元素的結果。
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的並行函數,其鍵和值是將提供的對映函數應用於輸入元素的結果。
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}
//第三個引數用在key值衝突的情況下:如果新元素產生的key在Map中已經出現過了,第三個引數就會定義解決的辦法。
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其鍵中的值,其值是將提供的對映函數應用於輸入元素的結果。
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.LinkedList

2.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.0

2.7 統計資料

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 用於收集統計資料(如計數,最小值,最大值,總和和平均值)的狀態物件。
此實現不是執行緒安全的。但是,Collectors.toXXXStatistics()在並行流上使用是安全的 ,因為並行實現Stream.collect() 提供了必要的分割區,隔離和合並結果,以實現安全有效的並行執行。

他們的方法如下:

void accept(int value)//新增一個值
void combine(IntSummaryStatistics other)//將另一個的狀態合併IntSummaryStatistics到這個狀態中。
double getAverage()//算術平均值,如果沒有記錄值,則返回零。
long getCount()//返回記錄的值的計數。
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.0

2.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函數

//op 縮減的函數
static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op)     
//identity儲存器初始值
static <T> Collector<T,?,T> reducing(T identity, BinaryOperator<T> op)
//mapper作用的數值
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);//2

2.10 計數

//返回Collector型別的接受元素,T用於計算輸入元素的數量。
static <T> Collector<T,?,Long>    counting()

2.11 分組-變成map

//classifier分組依據函數
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將小組內物件進行處理
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.TreeMap

2.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分割區的依據
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 收集器

通過在累積之前將對映函數應用於每個輸入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 收集之後繼續做一些處理

static <T,A,R,RR> Collector<T,A,RR>    collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)

到此這篇關於java收集器Collector詳情的文章就介紹到這了,更多相關java收集器 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com