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

使用流有条件地填充地图-Java8

潘琨
2023-03-14

我试图翻译这个(简化)代码使用Java-8流:

Map<String, String> files = new ConcurrentHashMap<String, String>();

while(((line = reader.readLine()) != null) {
      if(content != null)
        files.put("not null"+line, "not null"+line);
      else
        files.put("its null"+line, "its null"+line);
    }
reader.close();

以下是我尝试过的:

files = reader.lines().parallel().collect((content != null)?
                (Collectors.toConcurrentMap(line->"notnull"+line, line->line+"notnull")) :                                              
                (Collectors.toConcurrentMap(line->line+"null", line->line+"null")));

但以上给出了所有行的“循环推理”消息-

我注意到了一些类似的问题。但他们建议使用接口(Map)而不是其实现。但是这里的文件被声明为映射。

更新:添加更多上下文,content是保存目录名称的字符串。files是保存多个文件路径的映射。进入file映射需要哪些文件路径取决于Content目录名称是否填充。


共有3个答案

康弘义
2023-03-14

只是一个旁注。我对此表示怀疑。parallel()在这种情况下很有用。如果您使用标准Java API读取文件,那么下面的迭代器仍将按顺序读取文件。唯一将并行执行的事情是转换行。出于好奇,我刚在我的电脑上试用了一下,没有它,速度大约快了10%。并行()。

如果处理速度比读取流的输入慢一个数量级,那么并行化是有意义的,这里的情况并非如此。

步兴为
2023-03-14

你可以这样做

reader.lines().parallel()
    .map(line -> content == null ?
            new String[]{"notnull"+line, line+"notnull"} :
            new String[]{line+"null", line+"null"})
    .collect(Collectors.toConcurrentMap(pair -> pair[0], pair -> pair[1]));

首先,将该行映射到存储在数组(或某种类型的pair对象)中的(键、值)对,然后在收集器中再次将其拆分为键和值。

柴英博
2023-03-14

解决此问题的另一种方法是为收集器引入中间变量:

Collector<String, ?, ConcurrentMap<String, String>> collector = (content != null) ?
        (Collectors.toConcurrentMap(line->"notnull"+line, line->line+"notnull")) :
        (Collectors.toConcurrentMap(line->line+"null", line->line+"null"));
Map<String, String> files = reader.lines().parallel().collect(collector);       

此解决方案(与@JanXMarek提出的解决方案不同)不分配中间数组,也不检查每个输入行的内容。

循环推理是类型推理过程中的一种情况,当要确定内部子表达式的类型时,必须确定外部子表达式的类型,但如果不知道内部子表达式的类型,则无法确定外部子表达式的类型。Java-8中的类型推断可以在<代码>流的情况下推断

 类似资料:
  • 我无法用地图填充TableView 我有一个类,它拥有一个以产品名称为键、以正常价格为值的地图。我创建了一个tableView,其中一列是名称,一个主列是价格,分为两列normal和new,如下所示。 我已经做了这个方法使地图成为一个可观察列表。 这就是我卡住的地方。我不知道如何用这个可观察列表填充每个单元格。我确实知道我必须以某种方式使用“setCellFactory”。有人有什么建议吗?如何制

  • 我有两个不同形状的df。一个包含单词及其频率,另一个包含单词及其引理。 第一个df总是将一个单词映射到一个频率,第二个df将许多单词映射到一个引理(多次)。例如: DF1: 和df2: 我想将引理信息添加到,通过搜索的每个单词,将其与中的单词进行比较,并从中提取引理信息以将其添加回。 对于df1中的值是否始终相同,有一些有用的答案,但由于我想对每一行中包含不同单词的行执行此操作,因此我不确定如何继

  • 我试图找出正确的方法,有条件地包括一个视图与swiftui。我不能直接在视图中使用,必须使用堆栈视图才能做到这一点。 这是可行的,但似乎会有更干净的方法。

  • 我想知道是否可以使用来填充?我使用了而不是,因为我需要经常添加和删除,所以我需要最小化成本。 我的hashMap使用一个大整数作为键字段,一个具有许多属性的类型作为值字段。在我的tableView中,我只想显示每个属性都有一列的值。我希望你说清楚了 谢谢

  • 问题内容: 我怎么能展平的(同类型)s到一个用Java 8? 问题答案: 我的语法可能有些偏离,但是flatMap应该为您完成大部分工作:

  • 问题内容: 我建立了一个小型应用程序,可以读取Excel文件并为我创建所有必要的SQL语句。客户不时操纵Excel文件。 Excel文件的第一行包含一个标题,我在阅读这些行时需要将其转换为整数。例如,在生成SQL语句之前,标题“英语”需要翻译成“ 30”。(只是一些内部定义)。(您可以将其与DNS- IP地址映射中的人类可读域名进行比较)目前,我手动进行映射,但是我想通过一个很小的Spring配置