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

在 Java 流中执行简化操作时出现异常 [重复]

徐凌
2023-03-14

我是新手Java8,在下面的示例中,我创建了一个Map,其中keyvalue为String,value为ArrayList的整数。

Map<String,List<Integer>> mapLstInteger=new HashMap<String,List<Integer>>() {
            {
                put("A",Arrays.asList(1,2,3));
                put("B",Arrays.asList(4,5,6));
                put("C",Arrays.asList(7,8,9));
            }
        };

我编写了以下代码来针对每个键执行数组列表元素的总和,并尝试将总和值存储在单独的 ArrayList 中。

List<Integer> sumLst=mapLstInteger.entrySet().stream().map(e->e.getValue())
        .reduce((inputLst, outputLst)->{
            int sum=0;
            for(int count=0;count<inputLst.size();count++)
            {
                sum=sum+inputLst.get(count);
            }
            outputLst.add(sum);
            return outputLst;
        }).get();

当我尝试执行以下代码时,我收到以下异常

线程“main”中出现异常Java . lang . unsupportedoperationexception Java . util . abstract list . add(abstract list . Java:148)com . calculation . sum . client . client . lambda$1(client . Java:43)Java . util . stream . reduce ops$2 reducing sink . accept(reduce ops . Java:123)Java . util . stream . reference pipeline$3$1 . accept

谁能让我知道我在上面的代码中做错了什么

共有3个答案

华温书
2023-03-14

您应该执行以下操作:

    mapLstInteger.values().stream()
                 .flatMapToInt(list -> list.stream()
                                           .filter(Objects::nonNull)
                                           .mapToInt(Integer::intValue)).sum();

添加了过滤器,以确保在空整数的情况下不会得到空指针。一般来说,如果你被迫在一个流中使用一个传统的循环,你可能做错了。通过将整型列表转换为整型值,我们可以很容易地进行求和,如上所示。

最初误解了这个问题,以为你想要总和,唉,这里有一个针对实际问题的更新解决方案:

    mapLstInteger.values().stream()
                 .map(list -> list.stream()
                                  .filter(Objects::nonNull)
                                  .mapToInt(Integer::intValue).sum())
                                  .collect(Collectors.toList());
乜业
2023-03-14

发生这种情况是因为您使用的是由数组.asList 生成的原始抽象列表。
列表

public void add(int index, E element) {
    throw new UnsupportedOperationException();
}

但不管怎样,回到你的问题上。您也可以通过自定义的< code >收集器获得您想要的内容,在这里您可以提供您的自定义< code >列表

mapLstInteger.values()
             .stream()
             .collect(Collector.of(
                     () -> new ArrayList<>(),  // Supplier
                     (output, toSumList) -> {  // Accumulator
                         output.add(toSumList.stream()
                                             .mapToInt(Integer::intValue)
                                             .sum());
                     },
                     // The Combiner implementation will be called
                     // in case of a "parallel" Stream. 
                     // No need to worry about it here. 
                     // But in case, we would need to merge the partial results
                     (output, partial) -> {
                        output.addAll(partial);
                        return output;
                     }
             ));

更简洁的版本是

mapLstInteger.values()
             .stream()
             .map(l -> l.stream().mapToInt(Integer::intValue).sum())
             .collect(Collectors.toCollection(ArrayList::new));

这将正确输出 [6, 15, 24]

通飞尘
2023-03-14

首先,您使用的Arras::asList记录为返回由指定数组支持的固定大小的列表,我认为固定大小应该告诉您您做错了什么。

而不是你正在使用一种创建哈希地图的反模式 - 通过创建一个匿名的内部类,通过该地图扩展哈希地图

那么,您就违反了< code>reduce的规范,它应该总是返回一个新的对象,但是您总是放入< code>outputLst。

然后,当您只关心它的值时,您正在创建一个< code>Map,创建一个< code>List

甚至你的句子我在下面写的代码中对每个键执行 arrayList 元素的总和,根据你的代码是不正确的。我会决定我想要实现的实际目标,然后如果我是你,我会尝试去做。

 类似资料:
  • 我编写了一个简单的注释和一个AnnotationProcessor来处理注释。 注释只有一个值:它应该是现有接口(带有包)的名称。 注释处理器应该检索注释的值,检索接口的类对象,最后应该打印接口中声明的所有方法。 例:这是我的注解 这是带注释的类: 我的处理器看起来像 现在,如果我配置一个像java.lang.CharSequence这样的接口作为MyAnnoation的接口名称,这个工作原理很好

  • 有人能帮我解决这个问题吗?

  • 我试图将Quartz与spring boot一起使用,但我遇到了这个异常: 2021-04-01 19:07:25.753错误13088---[SchedulerThread]org.quartz.core.errorlogger:实例化要执行的作业时发生错误。job='ecadb474-77b7-45bd-926a-caee31728465' 有人能指出我哪里出了问题吗?

  • 因为在过滤2之后,我们还得再找到一个元素来分层极限(2),操作,那么为什么输出不像我解释的那样呢?

  • 问题内容: 我有一个http服务器(使用启动),我想做一些操作。 我该怎么做(在Linux上)?在ctrl-C的情况下可以进行那些操作吗? 我不熟悉Unix信号,因此答案可能很简单。 问题答案: 您可以使用信号包订购TERM和INT信号。但是请注意,只有在明确终止进程时才发送这些信号。正常退出(由流程本身启动)不涉及任何信号。我认为,对于正常退出,只需在主例程中执行某些操作即可(该例程应该生成工作

  • 我正在尝试执行简单的hibernate java程序- 使用的文件:hibernate。cfg。xml,员工。cfg。Java类:HibernateUtil。爪哇,员工们。爪哇,性别。java(Enum),InsertIntoEmployee。JAVA InsertIntoEmployee的代码。JAVA 获取以下错误: Classpath条目如下: 在过去的三天里,我一直在讨论这个问题。 谷歌搜