1

我正在使用Lists.transform方法。在此我有一个字符串输入和一个 CustomObject 输出。字符串输入应包含一个冒号。然后我在这个冒号上拆分,然后从字符串的两个部分创建自定义对象。

所以输入是

a:b
c:d
e:f

并且输出是三个 CustomObject 包含a, b c, 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

这在番石榴中可行吗?

如果我以冗长的方式执行此操作,我将在 for 循环中继续并记录错误。

例如作为伪代码

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

谢谢

4

3 回答 3

13

如果你真的不想走“经典”的方式,你总是可以在转换之前使用Iterables.removeIf

但是“好的旧循环”方式可能更适合您。Guava 开发人员对滥用这些功能性习语感到不满,因为他们在此处解释

过度使用 Guava 的函数式编程习惯会导致冗长、混乱、不可读和低效的代码。到目前为止,这些是 Guava 中最容易(也是最常见)被滥用的部分,当你不遗余力地让你的代码“单行”时,Guava 团队会哭泣。

于 2013-01-14T12:17:48.127 回答
5

我的方法会更实用,我会使用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 都转换为常量。

于 2013-01-14T14:01:23.390 回答
2

您可以更改函数以返回 Optional,并使用 Optional.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("", ""));
        }
    }));
于 2013-01-14T14:57:07.217 回答