1

Lists.transformメソッドを使用しています。これには、文字列入力とCustomObject出力があります。文字列入力にはコロンが1つ含まれている必要があります。次に、このコロンで分割し、文字列の2つの部分からカスタムオブジェクトを作成します。

したがって、入力は

a:b
c:d
e:f

出力は3つの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

a:b次に、とを含む2つのCustomObjectが必要です。g: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.*     

そして、関数とスプリッターの両方を定数に変換します。

于 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 に答える