java - 使用流收集返回相同的列表,对重复项进行切割和求和,抛出非静态引用

标签 java java-8 java-stream collectors

所以,我试图返回一个列表的列表,但对重复项进行剪切和求和,就像这样。

ID 1, VALUE 5
ID 1, VALUE 6
ID 2, VALUE 5
ID 3, VALUE 8
ID 3, VALUE 9

返回

ID 1, VALUE 11
ID 2, VALUE 5 
ID 3, VALUE 17

我在 StackOverflow 中搜索并实现了这个,

list.stream().collect(
Collectors.groupingBy(ListDTO::getId, Collectors.summingDouble(ListDTO::getValue)));

因此,为了返回一个列表,a 就这样做了,

list = list.stream().collect(
Collectors.groupingBy(ListDTO::getId, Collectors.summingDouble(ListDTO::getValue), Collectors.toList()));

但是,它现在给了我这个错误

Non-static method cannot be referenced from a static context

这里具体

ListDTO::getId

那么,任何人都可以解释我的问题吗?或者有更好的方法吗?

我的列表DTO

@Getter
@Setter

public class ListDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    private Double value;

    private Long id;

    public ListDTO(){}

    public ListDTO(Double value, Long id){
        this.value = value;
        this.id = id;
    }
}

最佳答案

试试这个。您可以使用带有合并功能的toMap收集器。

 Map<Integer,ListDTO> mapById = list.stream()
     .collect(Collectors.toMap(ListDTO::getId,
                       Function.identity(),(l1,l2)->{l1.sumValue(l2);return l1;}));

然后

List<ListDTO> result = new ArrayList<>(mapById.values());

你应该声明一个方法

public ListDTO sumValue(ListDTO l){
     this.value += l.value;
     return this;
}

关于java - 使用流收集返回相同的列表,对重复项进行切割和求和,抛出非静态引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57807892/

相关文章:

java - 容器代号一中的搜索过滤器

java - 仅当列表的第一个元素相等时,Stream 才返回对象

java - 使用 Java 8 中断/停止 forEachRemaining

Java 8 可选择在分层对象中进行 null 检查

java - 组、收集器、映射(整数到字符串)、映射(映射到对象)

java - 将真正特定的方法放入 DAO 类中是否正确?

java - 如何在java中设置消息对话框的位置?

java - 如何查看 Class<?> 是否实际上是 Class<T>?

dictionary - 如何从流中映射java中Duration字段的总和?

java - 使用 java Files.walk 仅从根文件夹获取文件名并跳过其子目录时出现问题