泛型用法和stream中collector接口使用

博客介绍了在将一个集合对象转换为另一个集合对象时,使用JDK1.8后的Stream进行处理。还给出了在HttpClient中使用的示例,其作用是构造post提交参数,该参数是所有成员id属性构成的List序列化后的字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用场景:在从一个集合对象转另一个集合对象

使用了jdk1.8后的stream处理

public class PrimaryUtil {
    public static <R extends IPrimaryKey<T>, T> Collection<T> primary(Collection<R> primaryKeyObjs){
        return primaryKeyObjs.stream().collect(new Collector<R, Collection<T>, Collection<T>>() {
            @Override
            public Supplier<Collection<T>> supplier() {
                return ArrayList::new;
            }
            @Override
            public BiConsumer<Collection<T>, R> accumulator() {
                return (c, e) -> {
                    c.add(e.primaryKey());
                };
            }
            @Override
            public BinaryOperator<Collection<T>> combiner() {
                return (a, b) -> {
                    a.addAll(b);
                    return a;
                };
            }
            @Override
            public Function<Collection<T>, Collection<T>> finisher() {
                return (a) -> a;
            }
            @Override
            public Set<Characteristics> characteristics() {
                return Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));
            }
        });
    }


    public static <R extends IPrimaryKey<T>, T> Collection<T> primary1(Collection<R> primaryKeyObjs){
        return primaryKeyObjs.stream().collect(new AbstractCollector<R, Collection<T>>() {
            @Override
            public Supplier<Collection<T>> supplier() {
                return ArrayList::new;
            }
            @Override
            public BiConsumer<Collection<T>, R> accumulator() {
                return (c, e) -> {
                    c.add(e.primaryKey());
                };
            }
        });
    }
}
abstract class AbstractCollector<R , T extends Collection>
        implements Collector<R, T, T> {

    @Override
    public BinaryOperator<T> combiner() {
        return (a, b) -> {
            a.addAll(b);
            return a;
        };
    }
    @Override
    public Function<T, T> finisher() {
        return (a) ->  a;
    }

    @Override
    public Set<Characteristics> characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));
    }
}
public interface IPrimaryKey<T>{

    T primaryKey();
}

 

 

使用demo

propertys.add(new BasicNameValuePair("user_ids", JsonUtil.serialize(PrimaryUtil.primary(getMembers()))));

这个里面是在httpClient中使用,这儿作用是构造post的提交参数。改参数填充的是所有成员的id属性构成的list序列化得到的字符串。

<think>我们正在讨论的是Java中的Collector接口,它通常用于流(Stream)操作的收集过程。用户想要初始化一个为String的Collector对象。在Java中,Collector是一个接口,因此我们不能直接实例化它,而是需要使用Collector.of()工厂方法或者使用预定义的Collectors工具类中的方法。根据引用[1]中提到的范式,我们可以使用方法引用来创建对象(如ArrayList::new),同样,Collector接口也可以通过类似的方式构建。Collector接口的初始化通常包括四个部分:1.一个Supplier(提供容器,例如ArrayList::new)2.一个累加器(BiConsumer,将元素添加到容器中,例如List::add)3.一个合并器(BinaryOperator,用于并行流合并多个容器,例如(list1,list2)->{list1.addAll(list2);returnlist1;})4.一个finisher(Function,对最终结果进行转换,可以省略,即恒等转换)另外,Collector还可以有一个特征集(Characteristics),用于指定收集器的属性,如是否并发、是否有序等。因此,要初始化一个Collector<String>,我们可以使用Collector.of()方法。示例:创建一个将字符串收集到ArrayList中的Collector。```javaCollector<String,ArrayList<String>,ArrayList<String>>collector=Collector.of(ArrayList::new,//创建一个新的容器(Supplier)(list,element)->list.add(element),//累加器(BiConsumer)(list1,list2)->{//合并器(BinaryOperator)list1.addAll(list2);returnlist1;},Collector.Characteristics.IDENTITY_FINISH//特征:恒等完成);```但是,实际上,对于这种简单的收集器,我们可以直接使用Collectors.toList(),它会返回一个Collector<T,?,List<T>>,其中T是流元素的类型。例如:```javaCollector<String,?,List<String>>collector=Collectors.toList();```注意:这里使用了通配符(?)表示中间结果类型,我们通常不需要关心。如果用户需要自定义收集行为,则必须按照上面的方式使用Collector.of()。另外,根据引用[2]中提到的Stream操作,我们可以将自定义的Collector用于流操作:```javaList<String>result=Stream.of("a","b","c").collect(collector);```总结:1.使用Collectors工具类中预定义的收集器(如Collectors.toList(),Collectors.toSet()等)是最简单的方式。2.如果需要自定义,则使用Collector.of()工厂方法。现在,针对用户的问题,初始化一个Collector<String>,我们可以有两种方式:方式一:使用预定义收集器(推荐)```javaCollector<String,?,List<String>>collector=Collectors.toList();```方式二:自定义收集器(例如,收集到LinkedList)```javaCollector<String,LinkedList<String>,LinkedList<String>>collector=Collector.of(LinkedList::new,LinkedList::add,(list1,list2)->{list1.addAll(list2);returnlist1;},Collector.Characteristics.IDENTITY_FINISH);```注意:在自定义收集器时,我们也可以指定finisher,例如如果我们希望最后转换为不可变集合,可以在finisher中做处理。另外,根据引用[3]中ThreadLocal的例子,我们也可以类比,但这里并不直接相关。因此,回答用户的问题:如何初始化一个为String的Collector对象?我们可以使用Collectors.toList()等预定义方法,或者使用Collector.of()自定义。下面给出一个完整的示例代码:```javaimportjava.util.*;importjava.util.stream.*;importjava.util.stream.Collector;publicclassCollectorExample{publicstaticvoidmain(String[]args){//使用预定义的CollectorCollector<String,?,List<String>>predefinedCollector=Collectors.toList();List<String>list1=Stream.of("Hello","World").collect(predefinedCollector);System.out.println(list1);//[Hello,World]//自定义一个Collector,将字符串收集到LinkedListCollector<String,LinkedList<String>,LinkedList<String>>customCollector=Collector.of(LinkedList::new,LinkedList::add,(l1,l2)->{l1.addAll(l2);returnl1;},Collector.Characteristics.IDENTITY_FINISH);LinkedList<String>list2=Stream.of("Java","Collector").collect(customCollector);System.out.println(list2);//[Java,Collector]}}```相关问题:1.如何自定义一个Collector来将字符串连接成一个字符串?2.Collector接口中的Characteristics有哪些?分别代表什么含义?3.在并行流中使用Collector需要注意什么?</think>### 初始化 `Collector<String>` 的详细方法 在 Java 中初始化 `Collector<String>` 通常有两种方式:使用预定义收集器或自定义收集器。以下是具体实现方法: #### 1. **使用预定义收集器 (推荐)** 通过 `java.util.stream.Collectors` 工具类提供的方法直接获取: ```java import java.util.stream.Collector; import java.util.stream.Collectors; // 示例 1:收集到 List<String> Collector<String, ?, List<String>> listCollector = Collectors.toList(); // 示例 2:收集到 Set<String> Collector<String, ?, Set<String>> setCollector = Collectors.toSet(); // 示例 3:连接字符串 Collector<String, ?, String> joiningCollector = Collectors.joining(","); ``` #### 2. **自定义收集器** 通过 `Collector.of()` 工厂方法创建完全自定义的收集器: ```java import java.util.*; import java.util.function.*; import java.util.stream.Collector; // 自定义收集器:将字符串收集到 LinkedList Collector<String, LinkedList<String>, LinkedList<String>> customCollector = Collector.of( LinkedList::new, // 1. 供应器(创建容器) LinkedList::add, // 2. 累加器(添加元素) (list1, list2) -> { // 3. 合并器(并行流合并) list1.addAll(list2); return list1; }, Collector.Characteristics.IDENTITY_FINISH // 4. 特性标志 ); ``` #### 3. **使用示例** ```java List<String> data = Arrays.asList("A", "B", "C"); // 使用预定义收集器 List<String> result1 = data.stream().collect(Collectors.toList()); // 使用自定义收集器 LinkedList<String> result2 = data.stream().collect(customCollector); ``` ### 关键组件说明 1. **供应器 (Supplier)** 创建结果容器(如 `LinkedList::new`)[^1] 2. **累加器 (Accumulator)** 添加元素到容器(如 `LinkedList::add`) 3. **合并器 (Combiner)** 合并并行操作的子结果(如 `list1.addAll(list2)`) 4. **特性标志 (Characteristics)** 指定收集器属性(如 `IDENTITY_FINISH` 表示无需最终转换) ### 注意事项 - 预定义收集器已优化性能,优先使用 `Collectors.toList()` 等标准方法 - 自定义收集器需正确处理并行流场景 - 签名说明: `Collector<T, A, R>` 中 `T=元素类型`, `A=中间容器`, `R=最终结果`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值