5

さて、私が本当に単純なクラスを持っているとしましょう、例えば

public class Baby {
   private String Name = "alf";
   public String getName() {
      return Name;
   }
}

今私が知りたいこと。赤ちゃんのリストを考えると、すべての赤ちゃんを単純にループして新しいリストに名前を追加するのではなく、Javaで赤ちゃんの名前の配列/配列リストを作成するためのより良い/より涼しい/より短い方法はありますか?これに相当します:

ArrayList<Baby> babies = new ArrayList<Baby>();
/* some code adding a bunch of babies to the arraylist */

ArrayList<String> names = new ArrayList<String>();
for (Baby b : babies) {
  names.add(b.getName());
}

...しかしもっと涼しい。わかる?

4

5 に答える 5

3

あなたはグアバ Lists.transformを使うことができます:

Function<Baby, String> getBabyNameFunction = new Function<Baby, String>() {
    @Override
    public String apply(Baby baby) {
        return baby.getName();
    }
};

List<String> babyNames = Lists.transform(babies, getBabyNameFunction);

ここでの主な違いbabyNamesは、変換が遅延して実行される元のリストのビューです。ドキュメントから:

関数は遅延して適用され、必要に応じて呼び出されます。List.contains(java.lang.Object)これは、返されるリストがビューであるために必要ですが、関数がやのような一括操作に何度も適用されることを意味します List.hashCode()。これがうまく機能するためには、機能が高速である必要があります。返されたリストがビューである必要がない場合の遅延評価を回避するには、返されたリストを選択した新しいリストにコピーします。

明らかに、を実装するための構文Functionはかなり冗長です-ラムダまではJavaです。私は通常、呼び出しサイトでの混乱や再インスタンス化を回避するために、一般的に使用される関数を定数として保持します。

public class Baby {

    ...

    public static class Functions {

        private static final Function<Baby, String> GET_NAME =
                new Function<Baby, String>() {
                    @Override
                    public String apply(Baby baby) {
                        return baby.getName();
                    }
                };

        private Functions() { }

        public static Function<Baby, String> getName() {
            return GET_NAME;
        }
    }
}

はい、それはさらに多くのコードですが、隠されており、より保守しやすくなっています。次に、コールサイトで:

List<String> babyNames = Lists.transform(babies, Baby.Functions.getName());
于 2012-11-14T06:37:45.787 に答える
1

GS コレクションでは、これを行う方法がいくつかあります。FastList と呼ばれる ArrayList のドロップイン置換を使用できます。

MutableList<Baby> babies = FastList.newList();
/* some code adding a bunch of babies to the fastlist */

MutableList<String> names = babies.collect(new Function<Baby, String>() {
    public String valueOf(Baby baby) {
        return baby.getName();
    }
});

または、ListIterate ユーティリティ クラスで ArrayList を使用できます。

ArrayList<Baby> babies = new ArrayList<Baby>();
/* some code adding a bunch of babies to the arraylist */

List<String> names = ListIterate.collect(babies, new Function<Baby, String>() {
    public String valueOf(Baby baby) {
        return baby.getName();
    }
});

結果の順序は気にしないが、重複を許可したい場合は、代わりに Bag を使用できます。

MutableList<Baby> babies = FastList.newList();
/* some code adding a bunch of babies to the fastlist */

MutableBag<String> names = babies.collect(new Function<Baby, String>() {
    public String valueOf(Baby baby) {
        return baby.getName();
    }
}, HashBag.<String>newBag());

int numberOfBabiesNamedXYZ = names.occurrencesOf("XYZ");

この関数を何度も使用している場合は、Baby クラスに定数として配置することをお勧めします。

注: 私は GS Collections の開発者です。

于 2012-11-16T17:32:15.073 に答える
0

ええと...簡単に言えば、違います。

それはあなたが次のようなものを探していると仮定しています

ArrayList<String> names = babies.getName();

Javaにはそのようなものはありません。

ただし、新しいクラスを作成して、それを行うことができます。

public class BabyNameifier {

    public BabyNameifier(){}

    public ArrayList<String> Nameify(ArrayList<Baby> babies) {
        ArrayList<String> names = new ArrayList<String>();
        for (Baby b : babies) {
            names.add(b.getName());
        }
        return names;
    }
}

そうすれば、後で次のように言うことができます。

ArrayList<Baby> babies = new ArrayList<Baby>();
/* some code adding a bunch of babies to the arraylist */

BabyNameifier babyNameifier = new BabyNameifier();
ArrayList<String> names = babyNameifier.Nameify(babies);

これは、世界がこれまでに知っている赤ちゃんの名前を体系的に取得するための最もクールな方法を作成します。

于 2012-11-14T06:36:14.770 に答える
0

あなたはそれを行うよりクールな方法をしたいですか?Spring フレームワークを知っているなら、あなたは幸運です!

applicationContext.xml に、次のように記述します。

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

<bean id="babyList" class="com.babies.BabyList">

    <property name="babyLists">
        <list>
            <bean class="com.babies.Baby">
                <property name="name" value="alice" />
            </bean>
            <bean class="com.babies.Baby">
                <property name="name" value="bob" />
            </bean>
            <bean class="com.babies.Baby">
                <property name="name" value="trudy" />
            </bean>
        </list>
    </property>
</bean>

 </beans>

これが通常のJavaのコードです

package com.babies;

 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;

  public class Main  {
      public static void main( String[] args ) {
          ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

          BabyList babyList = (BabyList)context.getBean("babyList");
          System.out.println(babyList);

    }
  }

これで、リストから名前を追加/削除したいときはいつでも、applicationContext.xml のリストを編集できます。すべてをハードコーディングする必要はありません。

このリンクから Spring フレームワーク コレクションの詳細を参照できます: http://www.mkyong.com/spring/spring-collections-list-set-map-and-properties-example/

または、単純に Spring について詳しく知りたい場合は、ここから始めるのが良いでしょう: http://www.mkyong.com/tutorials/spring-tutorials/

于 2012-11-14T06:47:00.627 に答える