<R> R collect(Supplier<R> supplier,
BiConsumer<R,? super T> accumulator,
BiConsumer<R,R> combiner)
参数一:supplier
接口的get
方法,提供一个容器(List,Map,Set),作为accumulator和combiner的参数,并且是最后的返回值(同被R泛型约束)
参数二:accumulator
接口的accept
方法来处理supplier提供的R类型容器,和stream中的元素,比如将元素添加到容器中去.对stream进行局部聚合.
参数三:combiner
接口的accept
方法来处理局部accumulator
产生的R类型容器.对局部结果进行全局聚合
有三种写法,注意之间的对应关系
1.使用实现类样例
package com;
import java.util.LinkedList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Supplier;
public class App2 {
public static void main(String[] args) {
LinkedList<Integer> integers = new LinkedList<>();
integers.add(1);
integers.add(2);
integers.add(3);
List res = integers.stream().collect(
new Supplier<List>() {
@Override
public List get() {
return new LinkedList();
}
},
new BiConsumer<List, Integer>() {
@Override
public void accept(List list, Integer integer) {
list.add(integer);
}
},
new BiConsumer<List, List>() {
@Override
public void accept(List list, List list2) {
list.addAll(list2);
}
}
);
System.out.println(res);
}
}
2.使用lambda样例
package com;
import java.util.LinkedList;
import java.util.List;
public class App2 {
public static void main(String[] args) {
LinkedList<Integer> integers = new LinkedList<>();
integers.add(1);
integers.add(2);
integers.add(3);
List res = integers.stream().collect(
()->new LinkedList(),
(list, integer) -> list.add(integer),
(list1,list2) -> list1.addAll(list2)
);
System.out.println(res);
}
}
3.使用方法引用
package com;
import java.util.LinkedList;
import java.util.List;
public class App2 {
public static void main(String[] args) {
LinkedList<Integer> integers = new LinkedList<>();
integers.add(1);
integers.add(2);
integers.add(3);
List res = integers.stream().collect(
LinkedList::new,
List::add,
List::addAll
);
System.out.println(res);
}
}
参考:
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#collect-java.util.function.Supplier-java.util.function.BiConsumer-java.util.function.BiConsumer-