番石榴列表.变换-如果一个输入是坏的



我正在使用列表。变换方法。在这里,我有一个字符串输入和一个CustomObject输出。字符串输入应该包含一个冒号。然后对这个冒号进行拆分,然后从字符串的两个部分创建自定义对象。

输入是

a:b
c:d
e:f

,输出为三个CustomObject,包含a, bc, de, f

我的代码类似于

return new ArrayList(Lists.transform(groups, new Function<String, CustomObject>() {
        @Override
        public CustomObject apply(String input) {
            String[] split = input.split(":");
            String one = split[0];
            String two = split[1];
            return new CustomObject(one, two);
        }
    }));

我的问题是我收到的列表来自用户。如果我有一个错误的输入,我想跳过列表

如果输入列表包含

a:b
d
e,f
g:h

那么我想要两个CustomObject包含a:bg:h

这在Guava中可能吗?

如果我用一种冗长的方式,我只会在for循环中使用continue并记录错误。

例如伪代码

for loop {
   if no colon present
      continue;
   create CustomObject
}

谢谢

如果你真的不想用"经典"的方式,你总是可以使用Iterables。

但是"好的旧循环"的方式可能更适合你。Guava开发人员不喜欢滥用这些函数式习惯用法,他们在这里解释道:

过度使用Guava的函数式编程习惯会导致冗长、混乱、不可读和低效的代码。这些是目前为止Guava最容易(也是最常见)被滥用的部分,当您竭尽所能地让代码变成"一行代码"时,Guava团队就会哭泣。

我的方法将更实用,我将使用FluentIterable:

return FluentIterable.from(groups).transform(new Function<String, CustomObject>() {
        @Override
        public CustomObject apply(String input) {
            String[] split = Iterables.toArray(
               Splitter.on(':').trimResults().omitEmptyStrings().split(input),
               String.class);
            if(split.length!=2) return null; // bad input data
            String one = split[0];
            String two = split[1];
            return new CustomObject(one, two);
        }
    }).filter(notNull()).toImmutableList();
         //   ^^  -- Predicates.*     

我将把Function和Splitter都转换为常量

你可以改变你的函数返回一个Optional,并使用option . presentinstances ():

    return Optional.presentInstances(Iterables.transform(groups, new Function<String, Optional<CustomObject>>() {
        @Override
        public Optional<CustomObject> apply(String input) {
            if (*/ bad input data */) {
                return Optional.absent();
            }
            // ...
            return Optional.of(new CustomObject("", ""));
        }
    }));

最新更新