<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
//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) }
public final class Collectors extends Object
Collectors作為Stream的collect方法的引數,Collector是一個介面,它是一個可變的匯聚操作,將輸入元素累計到一個可變的結果容器中;它會在所有元素都處理完畢後,將累積的結果轉換為一個最終的表示(這是一個可選操作);
Collectors本身提供了關於Collector的常見匯聚實現,Collectors的內部類CollectorImpl實現了Collector介面,Collectors本身實際上是一個
工廠。
//返回將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 )
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)
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
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)
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'}
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
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
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)
//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
//返回Collector型別的接受元素,T用於計算輸入元素的數量。 static <T> Collector<T,?,Long> counting()
//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
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)
//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)
通過在累積之前將對映函數應用於每個輸入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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45