jdk8 自定义收集器

博客介绍了Java自定义收集器,输入为Set,输出为Map<String, String>,给出示例输入输出。还提到主函数中IDENTITY_FINISH属性使用会出错,CONCURENT属性可让多线程操作一个结果容器,不加此属性parallelStream会操作多个中间容器,最后由combiner合并。

自定义收集器

public class MySetCollector<T> implements Collector<T, Set<T>,Set<T>> {
    @Override
    public Supplier<Set<T>> supplier() {
        System.out.println("supplier invoked");
        return HashSet<T>::new;
    }

    @Override
    public BiConsumer<Set<T>, T> accumulator() {
        System.out.println("accumulator invoked");
        //不能使用HashSet<T>::add 与Supplier那一块产生的容器可能有冲突 所以必须使用Set<T>
        //return (set,item) -> set.add(item);
        return Set<T>::add;
    }

    @Override
    public BinaryOperator<Set<T>> combiner() {
        System.out.println("combiner invoked");
        return (set1,set2)->{
          set1.addAll(set2);
          return set1;
        };
    }

    @Override
    public Function<Set<T>, Set<T>> finisher() {
        System.out.println("finisher invoked");
        return Function.identity();
    }

    @Override
    public Set<Characteristics> characteristics() {
        System.out.println("characteristics invoked");
        return Collections.unmodifiableSet(EnumSet.of(IDENTITY_FINISH,UNORDERED));
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList("hello","world","welcome");
        Set<String> set = list.stream().collect( new MySetCollector<>());
        System.out.println(set);
    }
}

复制代码
  • 输入:Set
  • 输出:Map<String,String> 示例输入 :[“hello”,"world","hello world"] 示例输出:[{hello,hello},{world,world},{hello world,hello world}]
public class MySetCollector2<T> implements Collector<T, Set<T>,Map<T,T>> {
    @Override
    public Supplier<Set<T>> supplier() {
        System.out.println("supplier invoked");
        return HashSet<T>::new;
    }

    @Override
    public BiConsumer<Set<T>, T> accumulator() {
        System.out.println("accumulator invoked");
        //不能使用HashSet<T>::add 与Supplier那一块产生的容器可能有冲突 所以必须使用Set<T>
        //return (set,item) -> set.add(item);
        return Set<T>::add;
    }

    @Override
    public BinaryOperator<Set<T>> combiner() {
        System.out.println("combiner invoked");
        return (set1,set2)->{
          set1.addAll(set2);
          return set1;
        };
    }

    @Override
    public Function<Set<T>,Map<T,T>> finisher() {
        System.out.println("finisher invoked");
        return set ->{
            Map<T,T> map = new HashMap<>();
            set.stream.forEach(item -> map.put(item,item));
            return map;
        };
    }

    @Override
    public Set<Characteristics> characteristics() {
        System.out.println("characteristics invoked");
        return Collections.unmodifiableSet(EnumSet.of(IDENTITY_FINISH,UNORDERED));
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList("hello","world","welcome");
        Set<String> set = list.stream().collect( new MySetCollector<>());
        System.out.println(set);
    }
}

复制代码
  • 主函数
List<String> list = Arrays.asList("hello","world","welcome","hello","a","b","c","d","e","f","g")

Set<String> set = new HashSet<>();
set.addAll(list);
System.out.println("set:"+set);
Map<String,String> map = set.stream().collect(new MySetCollector2<>());
System.out.println(map);
复制代码

IDENTITY_FINISH:将不使用finish函数 然后把Set<T,T>强制转换为Map<T,T>,结果会出错

CONCURENT:多个线程同时操作一个结果容器,不需要使用combiner 如果不加这个属性,parallelStream可以多个线程操作多个中间容器 最终由combiner函数合并多个中间容器

jdk方法实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值