java8中stream().collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator)说明

Posted Leo Han

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8中stream().collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator)说明相关的知识,希望对你有一定的参考价值。

java8中提供了Lambda表达式,常用的操作如下:
list.stream().collect()来进行操作,collect中传入的参数如下:

<R> R collect(Supplier<R> supplier,
                  BiConsumer<R, ? super T> accumulator,
                  BiConsumer<R, R> combiner);

Supplier 提供容器,供后续accumulatorcombiner使用

public interface Supplier<T> {
    T get();
}

Supplier只有一个方法,get返回一个容器,accumulator和combiner方法都会传入

accumulator 处理Supplier提供的T容器和stream中的元素U

@FunctionalInterface
public interface BiConsumer<T, U> {

    void accept(T t, U u);
    default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) {
        Objects.requireNonNull(after);

        return (l, r) -> {
            accept(l, r);
            after.accept(l, r);
        };
    }
}

accumulator 中的accept的方法接收两个参数,Supplier提供的容器T以及stream中的元素U,在accept方法中对其进行处理,常见的比如:T是一个ArrayList 将U类型元素添加到list中

combiner 用来将所有accumulator处理后的结果T进行处理

如果是多线程处理情况下,每个线程都会有一个supplier,最后需要将这些结果合并。

常见用法:

  • 实现类实现
List<JSONObject> jsons =  data.stream().collect(
                   new Supplier<List<JSONObject>>() {
                       @Override
                       public List<JSONObject> get() {
                           return new ArrayList<>();
                       }
                   },
                   new BiConsumer<List<JSONObject>, DisplayNetworkDto>() {
                       @Override
                       public void accept(List<JSONObject> jsonObjects, DisplayNetworkDto dto) {
                            JSONObject json = new JSONObject();
                            json.put("id",dto.getAd_id());
                            json.put("city",dto.getCity());
                            jsonObjects.add(json);

                       }
                   },
                   new BiConsumer<List<JSONObject>, List<JSONObject>>() {
                       @Override
                       public void accept(List<JSONObject> jsonObjects, List<JSONObject> jsonObjects2) {
                            jsonObjects.addAll(jsonObjects2);
                       }
                   }
            );
  • lambda表达式实现:
   List<JSONObject> jsons =  data.stream().collect(
                   ()->{return new ArrayList<>();},
                   (list,dto)->{
                       JSONObject json = new JSONObject();
                       json.put("id",dto.getAd_id());
                       json.put("city",dto.getCity());
                       list.add(json);
                   },
                   (list,list2)->{
                       list.addAll(list2);
                   }
            );
  • 方法引用实现:
 List<JSONObject> jsons =  data.stream().collect(
                  ArrayList::new,
                   (list,dto)->{
                       JSONObject json = new JSONObject();
                       json.put("id",dto.getAd_id());
                       json.put("city",dto.getCity());
                       list.add(json);
                   },
                   List::addAll
            );

以上是关于java8中stream().collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator)说明的主要内容,如果未能解决你的问题,请参考以下文章

通俗易懂,java8 .stream().map().collect()用法

通俗易懂,java8 .stream().map().collect()用法

标准 Kotlin 库中都有哪些 Java 8 Stream.collect 等效项?

Java8,stream().map().collect(Collectors.toList()).forEach()和stream().map().forEach()有什么区别?

java8中stream().collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator)说明

Java8 stream collect groupBy分组例子