両方とも文字列型の2つのフィールドfield1
とを持つオブジェクトのリストがあるとします。field2
field1
可能であれば、リストを反復処理せずにすべての値のリストを取得するにはどうすればよいですか?
両方とも文字列型の2つのフィールドfield1
とを持つオブジェクトのリストがあるとします。field2
field1
可能であれば、リストを反復処理せずにすべての値のリストを取得するにはどうすればよいですか?
幸い、Java8を使用してこれを行うことができます-Streams
YourEntityという名前のエンティティがあると仮定します
public class YourEntity {
private String field1;
private String field2;
public YourEntity(String field1, String field2) {
this.field1 = field1;
this.field2 = field2;
}
public void setField1(String field1) {
this.field1 = field1;
}
public void setField2(String field2) {
this.field2 = field2;
}
public String getField1() {
return field1;
}
public String getField2() {
return field2;
}
}
以下を使用してYourEntityのリストを宣言します。
List<YourEntity> entities = Arrays.asList(new YourEntity("text1", "text2"), new YourEntity("text3", "text4"));
この方法で、 field1のリストを1回のショットで抽出できます。
import java.util.stream.Collectors;
List<String> field1List = entities.stream().map(YourEntity::getField1).collect(Collectors.toList());
またはこのように
import java.util.stream.Collectors;
List<String> field1List = entities.stream().map(urEntity -> urEntity.getField1()).collect(Collectors.toList());
java8を使用してすべてのアイテムを印刷することもできます:)
field1List.forEach(System.out::println);
出力
text1
text3
これを試して:
List<Entity> entities = getEntities();
List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.class).getFielf1());
LambdaJを使用すると、明示的なループなしでコレクションにアクセスできるため、リストを自分で繰り返すためのコード行を増やす代わりに、LambdaJにアクセスさせることができます。
オブジェクトは、メモリアドレスへの参照です。次に、このオブジェクトのフィールドは、他のメモリアドレスへの他の参照です。したがって、オブジェクトのリストは参照のリストです。したがって、リストがオブジェクトフィールド(参照によって指定された参照)に直接アクセスすることは不可能です。簡単な答えはノーです。
注:とにかく、必要なことを実行するAPIが見つかりますが、それでも内部でループします。
...あなたの質問が次のいずれかに言及しているかどうavoiding iterating over the collection
か:
具体的には、次のような意味ですか。
ソリューションとオプションについては、以下を参照してください。
それが最初のものである場合は、Google Guava、LambdaJ、FunctionalJava、または基本的な機能構造を実装し、いくつかの表現力豊かな呼び出しで必要なことを実行できるその他のライブラリを調べてください。ただし、これらは缶に書かれていることを実行することを覚えておいてください。コレクションをフィルタリング、収集、または変換し、その要素を反復処理してこれを実行します。
例えば:
Set<String> strings = buildSetStrings();
Collection<String> filteredStrings =
Collections2.filter(strings, Predicates.containsPattern("^J"));
Array<Integer> a = array(97, 44, 67, 3, 22, 90, 1, 77, 98, 1078, 6, 64, 6, 79, 42);
Array<Integer> b = a.filter(even);
List<Integer> biggerThan3 = filter(greaterThan(3), asList(1, 2, 3, 4, 5));
2番目の場合、これはそのままでは不可能です。ただし、最初からすべてをアーキテクチャ化して、挿入時にフィールド値に基づいてオブジェクトにインデックスを付けるカスタムコレクションクラスによってオブジェクトを管理する必要がある場合を除きます。
リストとして取得したり、オンデマンドで設定したりできるように、上記の値でインデックス付けされたバケットにそれらを保持します。
dounyyの回答の下のコメントで述べられているように、そのようなカスタムコレクションを設計すると、受け入れる要素のAPIに影響を与える可能性があります(要素タイプに使用するスーパーインターフェイスを定義することによって)、またはかなり複雑な実装が必要になりますこのコレクションを汎用にしたい場合は、メンバーを動的に解決します(ほとんどの場合、リフレクションを使用します)。
言語としてのJavaもJDKライブラリも、まだあなたが望むことをしていません。LambdaJを使用するか、ラムダ式が含まれると予想されるJava8を待つことができます。
古代の質問ですが、私は同様の解決策を改善できるかどうかを探しているときにそれに出くわしました。
List<String>
肉付けを作成せずにインターフェースを実装できるためArrayList<String>
、親オブジェクトを反復処理する必要はありません。
final List<Entity> entities = getEntities()
final List<String> field1 = new AbstractList() {
public String get(int index) {
return entities.get(index).getField1();
}
public int size() {
return entities.size();
}
}
これにより、親オブジェクトを反復処理せずにリストが得られます。
派生物へのList<String>
ランダムアクセスは、基礎となるものへのランダムアクセスと同じくらい費用がかかりList<Entity>
ます。List<Entity>
迅速なランダムアクセスを提供しない実装を使用している場合は、いくつかのフープをジャンプする必要があるかもしれません(つまり、より多くのメソッドを実装しますList<String>
。ただし、これは、軽量が必要な場合の99%で機能するはずです。アダプタ。
オブジェクトを次のクラスにします。
public class Bike {
String bikeModel;
Int price;
}
そして今、タイプリストのbikeListと呼ばれるバイクのリストがあります
したがって、上記のリストにあるすべての自転車の自転車モデルのリストが必要です。
bikeList.map{ Bike b -> b.bikeModel }.toCollection(arrayListOf())
BikeList内のすべてのバイクオブジェクトの最初のフィールドの配列リストを返します
はい!!それが可能だ。しかし、あなたはいくつかの曲がった仕事をしなければなりません。
必要な変数を使用して内部クラスを作成します。例:ここでは2つの変数(TNAMEとTABTYPE)を使用します。
public class storeTables {
private String tablename = "";
private String tabletype = "";
public storeTables(String a, String b)
{
this.setTablename(a);
this.setTabletype(b);
}
public void setTablename(String tablename) {
this.tablename = tablename;
}
public String getTablename() {
return tablename;
}
public void setTabletype(String tabletype) {
this.tabletype = tabletype;
}
public String getTabletype() {
return tabletype;
}}
上で作成した内部クラスのリストを作成し、それをカプセル化することを忘れないでください。
private List<storeTables> objlist= new ArrayList<storeTables>();
リストに格納されている値を内部クラスオブジェクトとして取得します。
String Query="SELECT * FROM TAB";
while(rs.next())
{
String tname=rs.getString("TNAME");
String tabtype=rs.getString("TABTYPE");
getObjlist().add(new storeTables(tname,tabtype));
}
DATAMODELを作成し、リストをデータモデルにプッシュします
private DataModel selectableItems= new ListDataModel(objlist);
ワープしたデータを別のリストに取得します。
List<storeTables> items= (List<storeTables>)selectableItems.getWrappedData();
ついに!!!データを印刷します。
for(storeTables item:items){
System.out.println(item.getTablename());
}
多田!!!! タブタイプではなく、テーブル名のみが出力されます;)Javaでは不可能なことは何もないと信じてください。
いいえ、できません。リスト全体をトラバースして、各オブジェクトから各「field1」値を取得する必要があります。
たぶん、あなたはこの方法でハッシュマップを作成することができます:
HashMap<String, ArrayList<Object>> map;
キーはフィールドになります。このようにすると、HashMapに目的のフィールドに対応するオブジェクトを取得するように要求すると、マップはそのフィールドを持つすべての要素をまとめたArrayListを返します。
反復せずにこれを行うことはできません。何らかの方法で反復を減らすことはできますが、必須です。
異なるリストのレコードの値を追加し、1つまたは2つのイテレータを使用して、次のように個別の値を出力するだけです。
rs=st.executeQuery("select * from stu");
List data=new ArrayList();
List data1=new ArrayList();
while(rs.next())
{
data.add(rs.getString(1));
data1.add(rs.getString(2));
}
Iterator it=data.iterator();
Iterator it1=data1.iterator();
while(it1.hasNext())
{
System.out.println(" "+it.next()+" "+it1.next());
}