java - 如何从流中收集仅包含相同 X 类型对象的某些字段的 X 类型对象,而不使用辅助集合

标签 java java-8 java-stream collectors

一个例子:

这允许提取一个字段

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());

关于java - 如何从流中收集仅包含相同 X 类型对象的某些字段的 X 类型对象,而不使用辅助集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261408/

相关文章:

java - 如何使用 GraalVM 从 C++ 调用以非基本类型作为参数的 Java 入口点方法

java - Tomcat 访问日志 - 是否包括失败的请求?

java - Nashorn 启动慢可以克服吗?

java - Java8 中的 MapReduce 输出排序

Java 流 : filter(). count() 与 anyMatch()

Java 遍历 HashMap<?, List<?>> 并为每个 Key 计算 Key 有多少个 Values

java - 如何使用消费者查找生产者的状态

java - 如何使用线程尽可能快地读取 zip 流?

Java 流 : use optional filter() operations on chaining

java - 如何使用 Java Streams 获取对象列表的列表