Java 番石榴:是否可以不使用Multimaps.index()映射所有条目?

Java 番石榴:是否可以不使用Multimaps.index()映射所有条目?,java,guava,multimap,Java,Guava,Multimap,我收集了一些文件,其中一些不符合某些要求,而另一些则可以。我想在一次迭代中对这些文件进行索引化,并丢弃无用的文件。 我想在一次迭代中完成,因为这个数字相当大 所以,我在考虑使用Multimaps.index()时: //这是要处理的文件列表 集合文件列表=FileUtils.listFiles(pathToCtrFiles, 新字符串[]{“gz”},false); //现在我想根据文件名(模式)中的某些条件对文件进行索引 ImmutableListMultimap mappedFiles=Mu

我收集了一些文件,其中一些不符合某些要求,而另一些则可以。我想在一次迭代中对这些文件进行索引化,并丢弃无用的文件。 我想在一次迭代中完成,因为这个数字相当大

所以,我在考虑使用Multimaps.index()时:

//这是要处理的文件列表
集合文件列表=FileUtils.listFiles(pathToCtrFiles,
新字符串[]{“gz”},false);
//现在我想根据文件名(模式)中的某些条件对文件进行索引
ImmutableListMultimap mappedFiles=Multimaps.index(文件列表,
新函数()
{
@凌驾
公共设备申请(文件输入)
{
Matcher m=p.Matcher(input.getName());
如果(m.matches()){
返回enodebbycromonebidmap.get(m.group(2));
}
//我对这些文件不感兴趣。我能做什么?
返回null;
}
});
但是,不可能按照API中的规定执行:

抛出: NullPointerException-如果以下任一情况为真: 值为空 键函数为空 值中的元素为空 keyFunction为任何值元素返回null

所以我的问题是,你有没有一个优雅的方法来做到这一点,而不必重复文件列表两次


注意:我想返回一个伪元素,但是返回的列表是不可变的(没有删除它的机会)。

您可以在创建新列表时删除伪元素。但是使用假人不是很干净


我想,您可以在将
文件列表
传递到
Multimaps.index
之前对其进行过滤。过滤谓词应该简单地测试匿名函数是否返回non
null

在这种情况下,只需手动进行索引(如果您遗漏了一些值,那么您甚至没有真正进行索引)

ImmutableListMultimap.Builder=
ImmutableListMultimap.builder();
用于(文件:文件列表){
Matcher m=p.Matcher(file.getName());
如果(m.matches()){
builder.put(enodebByMacroEnbIdMap.get(m.group(2)),文件);
}
}
ImmutableListMultimap mappedFiles=builder.build();

它的行数更少,可读性也更高。

我们不能从设备中派生一个类,比如“dummeyenbequipment”,重写方法而不执行任何操作。返回新的dummeyenbequipment,其中返回null。这很复杂,因为该方法是API的一部分。客户机对派生类一无所知……这就是我想要避免的,对列表进行两次过滤:)这也是我最后做的。我猜番石榴不是银弹。。。PS.归功于
ImmutableListMultimap.builder()我没有意识到这一点
// This is the file list to work on
Collection<File> fileList = FileUtils.listFiles(pathToCtrFiles,
                                                new String[]{"gz"},false);

// Now I want to index the files according to some condition in the file name (a pattern)
ImmutableListMultimap<ENBEquipment, File> mappedFiles = Multimaps.index(fileList, 
new Function<File,ENBEquipment>()
{
    @Override
    public ENBEquipment apply(File input)
    {
        Matcher m = p.matcher(input.getName());
        if (m.matches()){
            return enodebByMacroEnbIdMap.get(m.group(2));
        }

        // I am not interesting in these files. What can I do?
        return null;
    }
});
ImmutableListMultimap.Builder<ENBEquipment, File> builder =
    ImmutableListMultimap.builder();
for (File file : fileList) {
  Matcher m = p.matcher(file.getName());
  if (m.matches()) {
    builder.put(enodebByMacroEnbIdMap.get(m.group(2)), file);
  }
}
ImmutableListMultimap<ENBEquipment, File> mappedFiles = builder.build();