2011-07-27 10 views
4

私はグアバを学ぼうとしています。しかし、チュートリアルが非常に少ないので、私はそれであまり成功していません。グアバでの繰り返し方法

Guavaにこのコードを書く方法を教えてください。

import java.util.*; 

public class list { 
    public static void main(String[] args) { 
    List l = new ArrayList(); 
    for (int i = 1; i < 6; i++) { 
     l.add(i); 
    } 
    Iterator it = l.iterator(); 
    while (it.hasNext()) { 
     System.out.println(it.next()); 
    } 
    } 
} 

答えて

3

私が知っている限りGuavaは、投稿したコードを簡略化するための機能を提供していません。

私が提案できる唯一の改善がgenericsを使用するために、むしろ明示的にイテレータを取得して使用するよりも、リストを反復するためenhanced for loopを使用して、次のとおりです。

import java.util.*; 

public class list { 
    public static void main(String[] args) { 
    List<Integer> l = new ArrayList<Integer>(); 
    for (int i = 1; i < 6; i++) { 
    l.add(i); 
    } 

    for(Integer i : l) { 
    System.out.println(i); 
    } 

} 
3

@Jaredラッセルは、このことを指摘したようにGuavaがあなたのコードにどのように役立つかを示す最良の標本ではありません。 immutable lists私はここで使用している2つのグァバのものがある

import com.google.common.base.Joiner; 
import com.google.common.collect.ImmutableList; 
import com.google.common.collect.ImmutableList.Builder; 

public class Question6842887 { 
public static void main(String[] args) { 
    Builder<Integer> builder = ImmutableList.builder(); 
    for (int i = 1; i < 6; i++) { 
     builder.add(i); 
    } 

    ImmutableList<Integer> list = builder.build(); 

    System.out.println(Joiner.on(System.getProperty("line.separator")).join(list)); 
} 

と:あなただけのグアバは、このコードにその方法を見つけることができる方法のデモンストレーションを探しているなら、ここでのショットだ、と述べた

joiner

これはおそらく通常、不変式リストが必要な状況ではありませんが、無関係に使用することをお勧めします。不変なコレクション(そして本当に不変なオブジェクト)の大きな利点は、それらがスレッドセーフであることです。防御的なコピーを作成する必要はありません。また、内容を変更した後、変更を心配する必要はありません。あなたは単に自由にそれを渡すことができます、またはそれをキャッシュし、その不変性について幸せで安全です。不変性の対象の詳細については、Effective Javaアイテム15を参照してください。

私がここでデモしている他のGuavaクラスは、Joinerです。ジョイナーは、セパレータを使用して文字列のコレクションを一緒に押し込む、素敵で簡単な方法です。かなりカスタマイズ可能で、ヌルとどのセパレータを使いたいのかを指定することができます。この場合、私はセパレータとしてSystem.getProperty("line.separator")を指定しました。代わりに", "などを使用することもできます。また、私はImmutableListにnull値がないことを知っているので、nullを扱わないことを選択しました。ただし、リストにNULL値が含まれる可能性がある場合は、skipNullsまたはuseForNullのようなオプションを選択できます。

Guavaの次のリリースでは、Rangeがサポートされる予定です。これはあなたのリスト構築を簡略化するために使用することができますContiguousSet<Integer> list = Ranges.closedOpen(1, 6).asSet(DiscreteDomains.integers());私はそれをお勧めしませんが、あなたのプログラム全体が1行になる可能性があります。

+0

とJared Russell ... Guavaを使用すると、通常のJava Collectionsと比べてより高速に繰り返し処理できます...(for Iterator itr = appCodeCombos.iterator(); itr.hasNext();) – Enosh

+0

パフォーマンスは期待できません明示的イテレータを使用してforループに対する "forループの強化"の恩恵を受ける悪意を持って遅い 'System.out.println'の呼び出しが1回しかないので、' Joiner'ソリューションは少し速くなると私は期待しています(ベンチマークしませんでした)。 – Ray

+0

Googleコレクションを使用すると、マイクロ秒で高速に実行されても、問題なく実行されるコードが高速になります – Enosh

5

グアバの次期バージョン10は、初期化のこの種は、はるかに少ない痛みを伴うようになります:

List<Integer> l = Lists.newArrayList(
     Ranges.closed(1, 5).asSet(DiscreteDomains.integers()) 
); 
for (Integer item : l) { 
    System.out.println(item); 
} 

(ありまだリリース10はありませんが、あなたがソースをダウンロードし、それを自分で構築することができます)

+0

これはちょうど間違っているように見えます。実際の世界がグアバコミッターにドメインについて忘れて欲しいと願っています。このアプローチは、演算子を同等の関数に置き換えるよりも賢明ではないようです... –

+0

@Gabriel私は反対します。これは私が絶対に楽しみにしている機能の1つです。はい、私はDiscreteDomainsのない範囲を好むでしょうが、私はそれらがはるかにあいまいではなく普遍的な有用性が低いということに同意する必要があります。 –

+0

私は間違っていません、私は範囲も楽しみにしていますが、彼らのためのユースケースの20%は時間の80%がドメインを必要としないと考えています。 –

1

この特定のケースでは、リストを使う必要はありません。@Sean Patrick Floydが範囲を使って示しているように - あなたが反復処理しているコレクションは数字の集合なので、リストは実際には使うべきベストタイプではありません。

グアバを使用すると、「最も一般的な型にプログラムする」という私の決意が強まりました。私は自分自身がますますIterableにプログラミングされるようになってきました。以前は何らかの理由でCollectionが最も抽象的な型ユースケース。

GuavaのIterablesクラスは、Iterable型の処理に非常に便利です。より良いコードにつながると思います。の1つの生みの親から良いブログ記事はhereあり

Iterable<Integer> l = Ranges.closed(1, 5).asSet(DiscreteDomains.integers()); 
for (Integer item : l) { 
    System.out.println(item); 
} 

EDIT

:それは次のようになり書くためのきれいな方法 - グアバの私の現在のバージョン(12.0)を使用して

なぜIterable(Kittensの死など...)にプログラムしないかについてのアサートを祝う。私はまだすべての状況でそれの邪悪を徹底的には確信していませんが、私はいくつかのケースであなたのコードを消費する人にとっては、特にAPI設計の場合にはかなり厳しいことを認めています。

+1

最近のバージョンでは、非推奨エラーを避けるためにContiguousSet.create(Range.closedOpen(1、6)、DiscreteDomains)が必要です。整数()) '(私はほとんど常にclosedOpenの範囲を好む) –

+0

そして、私は投稿の考え方が間違っていると思います。 (<〜その時代)便宜のために複雑な言葉を追加することは本当に悪い考えです(シンプリシティについてはリッチ・ヒッキーの講演をご覧ください)。 –

関連する問題