簡體   English   中英

如何從流中收集X類型對象,該流僅包含同一X類型對象的某些字段,而不使用輔助收集

[英]How to collect X type objects from a stream, that contain only some fields of the same X type object, without using an auxiliary collection

一個例子:

這允許提取一個字段

Collection<X> base=...;
List<?> c=base.stream().map(->i.getField()).distinct.collect(Collectors.toList()));

這需要輔助收集

Collection<X> fromBase; //empty collection
Collection<X> base=...;
List<?> c=base.stream().forEach(i->{
    X k=...; //create object X with some fields
    fromBase.add(k);
});

有沒有一種方法可以直接提取更多字段,例如.map()?

基本示例:

List<X> lst;

private void collectDistinctItems(){
    lst = new ArrayList<>();
    getSomeItems().stream().forEach(i->{  //Collection<X>
        X tmp=new X();
        tmp.setField1(i.getField1());  //copy some fields
        tmp.setField2(i.getField2());
        tmp.setField3(i.getField3());
        ...

        if(!lst.contains(tmp)) lst.add(tmp); //add new X item to X type list
    });
}

第一步是使用收集器:

lst = getSomeItems().stream().map(i->{  //Collection<X>
      X tmp=new X();
      tmp.setField1(i.getField1());  //copy some fields
      tmp.setField2(i.getField2());
      tmp.setField3(i.getField3());
      return tmp; })
    .distinct()
    .collect(toList());

您還可以將副本提取到單獨的方法中:

private static X copy(X original) {
    X tmp=new X();
    tmp.setField1(i.getField1());  //copy some fields
    tmp.setField2(i.getField2());
    tmp.setField3(i.getField3());
    return tmp;
}

並使用方法參考:

lst = getSomeItems().stream()
    .map(MyClass::copy)
    .distinct()
    .collect(toList());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM