Java 如何从列表中存储的对象获取特定字段值的列表?
假设我有一个对象列表,其中有两个字段Java 如何从列表中存储的对象获取特定字段值的列表?,java,collections,Java,Collections,假设我有一个对象列表,其中有两个字段field1和field2,都是字符串类型 如果可能的话,我如何获得一个包含所有字段1值的列表而不必迭代该列表?不,您不能。您必须遍历整个列表,并从每个对象获取每个“field1”值。尝试以下操作: List<Entity> entities = getEntities(); List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.cla
field1
和field2
,都是字符串类型
如果可能的话,我如何获得一个包含所有
字段1
值的列表而不必迭代该列表?不,您不能。您必须遍历整个列表,并从每个对象获取每个“field1”值。尝试以下操作:
List<Entity> entities = getEntities();
List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.class).getFielf1());
List entities=getEntities();
List listIntegerenties=Lambda.extract(entities,Lambda.on(Entity.class).getFielf1());
LambdaJ允许在没有显式循环的情况下访问集合,因此您可以让LambdaJ自己迭代列表,而不是使用更多的代码行。对象是指向内存地址的引用。然后,该对象的字段是指向其他内存地址的其他引用。 因此,对象列表就是引用列表。因此,列表不可能直接访问对象字段(引用提供的引用)。简而言之,答案是否定的
注意:不管怎样,你会发现一个API做了你想要的,它仍然在内部循环。java作为一种语言或JDK库都没有做你想要的。您可以使用或等待预期包含lambda表达式的Java 8。也许您可以通过以下方式创建哈希映射:
HashMap<String, ArrayList<Object>> map;
import java.util.stream.Collectors;
List<String> field1List = entities.stream().map(YourEntity::getField1).collect(Collectors.toList());
HashMap;
关键是场地。
这样做,当您要求HashMap检索与所需字段对应的对象时,map将返回一个ArrayList,其中包含具有该字段的所有元素。不进行迭代是不可能的。您可以以某种方式减少迭代,但这是必须的。取决于。。。 。。。您的问题是否涉及
避免重复集合
:
- 在呼叫点易于实施方面
- 或在算法复杂性方面
- 您不想自己键入迭代构造(只需使用一个方便的库)
- 或者你真的想要一个在O(1)中自动返回元素的东西,而不需要处理它们(并且拥有完美的访问权限)
使用便利图书馆 如果它是第一个,那么看看Google Guava、LambdaJ、FunctionalJava或其他实现基本函数构造的库,它们将允许您在几个表达性调用中实现您想要的功能。但请记住,它们会按照tin上的说明进行操作:它们会过滤、收集或转换一个集合,并通过其元素进行迭代 例如:
- :
Set strings=buildSetStrings(); 收集过滤器字符串= Collections2.filter(字符串、谓词.containsPattern(^J));
- :
Array a=Array(97,44,67,3,22,90,1,77,98,1078,6,64,6,79,42); 阵列b=a.滤波器(偶数);
- :
List biggerThan3=filter(大于(3),asList(1,2,3,4,5));
完全访问 如果是第二个,这是不可能的,除了如果您从一开始就构建了所有内容,以便您的对象应该由自定义集合类管理,该类将根据插入时的字段值对对象进行索引 它会将它们保存在按上述值索引的存储桶中,以便您随时可以将它们作为列表或按需设置来检索
正如dounyy回答下面的评论中提到的,设计这样一个自定义集合可能会对它将接受的元素的API产生影响(很可能是通过定义用于元素类型的超级接口),或者需要相当复杂的实现来动态解析成员(很可能是通过使用反射),如果您希望此集合是通用的。在不同的列表中添加记录的值,并使用一个或两个迭代器简单地打印 单独的值如下所示:
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());
}
是的!!这是可能的。
但是你必须做一些不正当的工作
private List<storeTables> objlist= new ArrayList<storeTables>();
private DataModel selectableItems= new ListDataModel(objlist);
List<storeTables> items= (List<storeTables>)selectableItems.getWrappedData();
任何疑问 这是一个古老的问题,但我在寻找类似的解决方案时发现了它 您可以实现
列表
接口,而无需创建充实的ArrayList
,因此不会迭代父对象
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();
}
}
final List entities=getEntities()
最终列表字段1=新的抽象列表(){
公共字符串get(int索引){
返回entities.get(index.getField1();
}
公共整数大小(){
返回实体的大小();
}
}
这将为您提供一个列表,而无需迭代父对象
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();
}
}
随机访问派生的
列表
与随机访问基础列表
一样昂贵;如果您使用的是不提供快速随机访问的列表
实现,那么您可能需要跳过一些障碍(即实现更多的列表
方法)。但这应该适用于99%需要轻型适配器的情况。幸运的是,您可以使用
假设您有一个名为“您的实体”的实体
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;
}
}
使用以下方法声明您的实体列表:
List<YourEntity> entities = Arrays.asList(new YourEntity("text1", "text2"), new YourEntity("text3", "text4"));
输出
text1
text3
让对象属于以下类
public class Bike {
String bikeModel;
Int price;
}
现在有一个名为“泰自行车列表”的自行车列表
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;
}
}
List<YourEntity> entities = Arrays.asList(new YourEntity("text1", "text2"), new YourEntity("text3", "text4"));
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());
field1List.forEach(System.out::println);
text1
text3
public class Bike {
String bikeModel;
Int price;
}
bikeList.map{ Bike b -> b.bikeModel }.toCollection(arrayListOf())