java中StreamAPI的Collector原理分析
2021-06-04 18:03
标签:link control 完成 port cts string lan operator class StreamAPI是java8提供的一种方便,高效操作容器的工具。 Stream对象调用collect()方法,根据不同的Collector返回不同的结果。 定义一个自己的Collector 输出打印结果为 finisher()方法没有被执行,在包含IDENTITY_FINISH标识时,会进行强制类型转换,没有时才会调用。 java中的收集器默认实现,一个收集器包括:供应器,累加器,合并器,完成器,标识列表。 我们常用的toList()收集器,返回一个ArrayList,标识列表包含IDENTITY_FINISH,表示中间类型和结果类型相同,可以强制类型转换。 java中StreamAPI的Collector原理分析 标签:link control 完成 port cts string lan operator class 原文地址:https://www.cnblogs.com/strongmore/p/14646230.html前言
简单使用
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Client {
public static void main(String[] args) {
List
/**
* 收集器接口
*/
public interface Collector
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.function.BiConsumer;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.stream.Collector;
public class MyListCollector
> supplier() {
System.out.println("supplier() invoked");
return () -> {
System.out.println("new a ArrayList");
return new ArrayList();
};
}
@Override
public BiConsumer
, T> accumulator() {
System.out.println("accumulator() invoked");
return (list, item) -> {
System.out.println("list add a item");
list.add(item);
};
}
@Override
public BinaryOperator
> combiner() {
System.out.println("combiner() invoked");
return (left, right) -> {
System.out.println("left list addAll right");
left.addAll(right);
return left;
};
}
@Override
public Function
, List
import java.util.Arrays;
import java.util.List;
public class Client {
public static void main(String[] args) {
List
supplier() invoked
accumulator() invoked
combiner() invoked
new a ArrayList
list add a item
list add a item
[HELLO, WORLD]
combiner()方法在并行流且没有CONCURRENT标识时才会执行,这是因为包含CONCURRENT标识时,并行流只会操作同一个结果容器,不包含时,会创建多个结果容器进行合并。源码分析
/**
* Simple implementation class for {@code Collector}.
*
* @param
/**
* Returns a {@code Collector} that accumulates the input elements into a
* new {@code List}. There are no guarantees on the type, mutability,
* serializability, or thread-safety of the {@code List} returned; if more
* control over the returned {@code List} is required, use {@link #toCollection(Supplier)}.
*
* @param
>) ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
下一篇:Java第六次上机+练习
文章标题:java中StreamAPI的Collector原理分析
文章链接:http://soscw.com/index.php/essay/90505.html