当前位置: 首页 > 知识库问答 >
问题:

找不到适合收集/减少的方法-无法将整数列表与流()求和

单昊穹
2023-03-14

在输入中,我有一个整数和字符串的列表。

第一条流工作正常,第二条流工作到过滤器,我不知道为什么。我的代码:

import java.util.List;
import java.util.stream.*;

public class MixedSum {

    public int sum(List<?> mixed) {

        int m = mixed.stream().filter(x -> x instanceof String).map(x -> Integer.parseInt((String) x)).collect(Collectors.summingInt(Integer::intValue));
        int n = mixed.stream().filter(x -> x instanceof Integer).collect(Collectors.summingInt(Integer::intValue));

        return m + n;
    }
}

我有这个错误:

错误:找不到适合收集的方法(收集器

共有2个答案

曾实
2023-03-14

编译器无法推断类型。你需要像第一步一样施展:

int n = mixed.stream()
             .filter(x -> x instanceof Integer)
             .map(x -> (int) x)
             .collect(Collectors.summingInt(Integer::intValue));

或者如果要使用方法引用

int n = mixed.stream()
             .filter(x -> x instanceof Integer)
             .map(Integer.class::cast)
             .collect(Collectors.summingInt(Integer::intValue));
宰父焕
2023-03-14

在第二个流中应用方法引用Integer::intValue之前,必须将流的元素强制转换为Integer类型。

由于您只想获得整数原语的总和,因此无需求助于收集器,相反,您可以将对象流强制到IntStream并应用sum()方法。

        int m = mixed.stream()
                .filter(x -> x instanceof String)
                .mapToInt(x -> Integer.parseInt((String) x))
                .sum();
        
        int n = mixed.stream()
                .filter(x -> x instanceof Integer)
                .mapToInt(x -> (Integer) x)
                .sum();

无需重复两次,因为在源代码列表中,只能丢弃除整数和字符串之外的类型过滤器。因此,您的方法最终可以归结为几行:

    public int sum(List<?> mixed) {
        return mixed.stream()
                .mapToInt(x -> x instanceof Integer? (Integer) x : Integer.parseInt((String) x))
                .sum();
    }

注:

  • 因为<代码>整数。parseInt()可能会导致数字格式异常,如果转换失败,如果源列表中至少包含一个由数字以外的其他符号组成的字符串,则流将不会生成该值。这就是所谓的fail-fast实现,如果您的意图不是在数据无效的情况下返回值,而是在异常情况下强调它,那么这是有意义的
   strSource.stream().map(Integer::parseInt).collect(Collectors.toList());

因此,将免除方法的多余责任和合同,以:

   list.stream().mapToInt(Integer::intValue).sum();
 类似资料:
  • 我一直在研究如何将IntStream“收集”到一个列表中从而生成一个随机的int列表,但是编译器一直在抱怨。下面是一段代码: 编译器给出的错误: 错误:(42,49)Java:接口java.util.Stream.IntStream中的方法collect不能应用于给定类型; 必需:java.util.function.supplier,java.util.function.objintconsum

  • 在启动activity中找不到合适的方法是显示错误的错误是: 错误:(123,17)错误:找不到适合startActivities(Intent)方法上下文的方法。startActivities(Intent[])不适用(参数不匹配;Intent无法转换为Intent[])方法上下文。startActivities(Intent[])不适用(参数不匹配;Intent无法转换为Intent[])方法

  • 我想收集一些数据并将其存储到数据库(在Java中,使用MySQL)。其中一个数据是日期(创建/插入此条目时)。 我已经试过了 将日期转换为SQL友好的格式,但我仍然得到错误 找不到适合getDate(Date)的方法 方法结果集。getDate(int)不适用 (参数不匹配;日期无法转换为int) 方法ResultSet.get日期(字符串)不适用 (参数不匹配;日期无法转换为字符串) 错误发生在

  • 什么时候使用和?有没有人有好的、具体的例子来说明什么时候走一条路或者走另一条路更好呢? Javadoc提到collect()是一个可变约简。 以上的说法是猜测,然而,我希望一个专家在这里插话。

  • 我试图在Flink的数据流上应用每窗口功能。以下是我的代码 下面是我的实现MyProcessWindow函数 然而,当我试图通过maven编译上述代码时,我得到了以下错误 知道我做错了什么吗?仅供参考,我正在使用ApacheFlink 1.5.1版,并在Mac上使用maven3编译Java代码。

  • 算法问题:给定一个非负整数列表,将它们排列成最大的数。 例如,给定[3,30,34,5,9],形成的最大数是9534330。 注意:结果可能很大,因此需要返回一个字符串,而不是整数。 而且我还在想办法避免使用额外的空间。