Java 如何迭代自定义类型并查找特定类型?
我有一个奥利弗级的ArrayList:Java 如何迭代自定义类型并查找特定类型?,java,Java,我有一个奥利弗级的ArrayList: ArrayList<Olive> olives = new ArrayList<Olive>(); olives.add(new Kalamata()); olives.add(new Ligurian()); olives.add(new Kalamata()); olives.add(new Ligurian()); 如何迭代Olive类型的arrayList?我想找到name variable=“Ligurian”的位置,
ArrayList<Olive> olives = new ArrayList<Olive>();
olives.add(new Kalamata());
olives.add(new Ligurian());
olives.add(new Kalamata());
olives.add(new Ligurian());
如何迭代Olive类型的arrayList?我想找到name variable=“Ligurian”的位置,然后返回Ligurian.getOrigin()使用streams API:
Olive olive = olives.stream()
.filter(o -> o.name.equals("Ligurian"))
.findAny().get();
String origin = olive.getOrigin();
如果您使用的是Java 7,则可以使用循环,这对您来说是一种耻辱,但也可以:
Olive found;
for(Olive olive : olives) {
if(olive.name.equals("Ligurian")) {
found = olive;
break;
}
}
String origin = found.getOrigin();
在Java中,迭代自定义类型并选择一个
for (Olive olive : olives) {
if (olive instanceof Ligurian) {
String origin = olive.getOrigin();
}
}
考虑让这个课程来管理你的橄榄(或其他任何东西): 请注意,作为一个附加功能,即使不公开
getName
,这也可以工作。它不使用getName
而是使用添加对象的类来进行子类别化或分区。使用实际的类名,比如使用olives.get(Ligurian.class)
时,会带来额外的好处,即在编译时会发现输入错误,并且返回的对象是强类型的
如果这样做的开销可以忽略不计,那么在积累数据时总是更好地组织数据。这将使以后的处理更加高效(如果您编码正确的话)。对以后如何使用它进行预见会有所帮助
可能还需要另外一个想法,即在多个类加载器的情况下应该做什么。我不确定。可能需要改为使用类名在内部存储。是否尝试过使用循环?然后在找到并处理第一个项目后,中断。“我应该提一下。”LiganmentsRasher我添加了一个Java7的答案。好主意。您好,谢谢您的回答,我只从ligurian类本身实现了getOrigin,因此这种方式向我展示了如何从超类获取Origin?@初学者问题这是一种对迭代中第一个对象调用
getOrigin
的方法,该对象的名称
属性等于“ligurian”
。没有更多,没有更少-你可以调用它的任何Olive
方法。对不起,我很困惑,我怎么才能让它成为利古里亚类的起源?因为find.getOrigin()希望我在超类上实现该方法。
for (Olive olive : olives) {
if (olive instanceof Ligurian) {
String origin = olive.getOrigin();
}
}
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TypedList<T> {
Map<Class<? extends T>,List<T>> mlt;
public TypedList() {
mlt = new HashMap<>();
}
private <U extends T> void add(Class<U> t,U o) {
List<U> lu = (List<U>)mlt.get(t);
if (lu == null) {
lu = new ArrayList<>();
mlt.put(t, (List<T>)lu);
}
lu.add(o);
}
public void add(T o) {
add((Class<T>)o.getClass(),o);
}
public <U extends T> List<U> get(Class<U> t) {
return (List<U>)mlt.get(t);
}
public <U extends T> List<? extends U> getIncludingDescendands(Class<U> t) {
List<U> nl = new ArrayList<>();
// Inefficient Unions
mlt.entrySet().stream().filter((e)->t.isAssignableFrom(e.getKey())).forEach((e)->{nl.addAll((List<U>)e.getValue());});
return nl;
}
}
public class Main {
public static void main(String[] args) {
TypedList<Olive> olives = new TypedList<>();
olives.add(new Kalamata());
olives.add(new Ligurian());
olives.add(new Kalamata());
olives.add(new Ligurian());
olives.add(new BigKalamata());
System.out.println("Number of Ligurian: "+olives.get(Ligurian.class).size());
System.out.println("Number of Kalamata: "+olives.get(Kalamata.class).size());
System.out.println("Number of BigKalamata: "+olives.get(BigKalamata.class).size());
System.out.println("Number of Kalamata and Subspecies: "+olives.getIncludingDescendands(Kalamata.class).size());
// get first Ligurian:
Ligurian ligurian = olives.get(Ligurian.class).get(0); // Carefull for NPE
}
}
public interface Olive {}
public class Ligurian implements Olive {}
public class Kalamata implements Olive {}
public class BigKalamata extends Kalamata {}