Java 8 Collectors.collectingAndThen()


Java 8 Collectors.collectingAndThen()

 

JDK源碼#

java.util.stream.Collectors#collectingAndThen方法的作用是將Collector的結果在執行一個額外的finisher轉換操作,其源碼如下:

/**  * Adapts a {@code Collector} to perform an additional finishing  * transformation. For example, one could adapt the {@link #toList()}  * collector to always produce an immutable list with:  * <pre>{@code  * List<String> people  * = people.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList));  * }</pre>  *  * @param <T> the type of the input elements  * @param <A> intermediate accumulation type of the downstream collector  * @param <R> result type of the downstream collector  * @param <RR> result type of the resulting collector  * @param downstream a collector  * @param finisher a function to be applied to the final result of the downstream collector  * @return a collector which performs the action of the downstream collector,  * followed by an additional finishing step  */ public static<T, A, R, RR> Collector<T, A, RR> collectingAndThen(Collector<T, A, R> downstream, Function<R, RR> finisher) {  Set<Collector.Characteristics> characteristics = downstream.characteristics();  if (characteristics.contains(Collector.Characteristics.IDENTITY_FINISH)) {  if (characteristics.size() == 1) {  characteristics = Collectors.CH_NOID;  } else {  characteristics = EnumSet.copyOf(characteristics);  characteristics.remove(Collector.Characteristics.IDENTITY_FINISH);  characteristics = Collections.unmodifiableSet(characteristics);  }  }  return new CollectorImpl<>(downstream.supplier(),  downstream.accumulator(),  downstream.combiner(),  downstream.finisher().andThen(finisher),  characteristics); } 
  • T:輸入元素的類型
  • A:下游Collector的中間堆積類型
  • R:下游Collector的結果類型
  • RR:結果Collector的結果類型

參數:此方法接受下面列出的兩個參數

  • downstream: Collector的一個實例,可以使用任何Collector
  • finisher: 類型是Function,該函數將應用於下游Collector的最終結果

返回值:返回一個執行下游Collector動作的Collector,然后在finisher函數的幫助下執行附加的轉換步驟。

范例:#

創建不可變集合#

// Create an Immutable List List<String> lt = Stream.of("GEEKS", "For", "GEEKS").collect(Collectors.collectingAndThen(Collectors.toList(), Collections::<String>unmodifiableList));  // Create an Immutable Set Set<String> st = Stream.of("GEEKS", "FOR", "GEEKS").collect(Collectors.collectingAndThen(Collectors.toSet(), Collections::<String>unmodifiableSet));  // Create an Immutable Map Map<String, String> mp = Stream.of(new String[][] {{ "1", "Geeks" }, { "2", "For" }, { "3", "Geeks" }})  .collect(Collectors.collectingAndThen(Collectors.toMap(p -> p[0], p -> p[1]), Collections::<String, String>unmodifiableMap)); 

對象去重:#

List<Xxx> distinctList = rowList.stream()  .collect(Collectors.collectingAndThen(  Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(obj -> String.join("-", obj.getA(), obj.getB(), obj.getC())))),  ArrayList::new  )); 
Map<Integer, BigDecimal> mongthValuePair = map.computeIfAbsent(year, ArrayList::new)  .stream().collect(Collectors.toMap(A::getMonth, A::getValue)); 

參考文章:#


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM