Java 如何通过arraylist搜索子类

Java 如何通过arraylist搜索子类,java,arraylist,Java,Arraylist,假设我们正在设计一家商店。我们的商店有许多种类的产品——处理器、屏风等。。我们构建了一个界面,并提示用户提供特定类型的productex。处理器和th程序应在屏幕上显示所有处理器。有两个超类、外围设备和小工具。所有产品都是这两个产品之一的子类。我们有两个ArrayListType外围设备,类型gadget,包含每个类别的所有产品。问题是:如何仅显示所需类型的产品。使用Java Streams: myList .stream() .filter(item -> item instance o

假设我们正在设计一家商店。我们的商店有许多种类的产品——处理器、屏风等。。我们构建了一个界面,并提示用户提供特定类型的productex。处理器和th程序应在屏幕上显示所有处理器。有两个超类、外围设备和小工具。所有产品都是这两个产品之一的子类。我们有两个ArrayListType外围设备,类型gadget,包含每个类别的所有产品。问题是:如何仅显示所需类型的产品。

使用Java Streams:

myList
.stream()
.filter(item -> item instance of DesiredClass)
.forEach(System.out::println);
myList
.stream()
.filter(item -> item.getClass().equals(type))
.forEach(System.out::println);
没有溪流:

for(Superclass item: myList){
  if(item instanceof DesiredClass){
    System.out.println(item.toString())
  }
}
for(Superclass item: myList){
  if(item.getClass().equals(type)){
    System.out.println(item.toString())
  }
}
编辑1:


是的,我理解这种方式,但a有太多想要的类,所以最好不要使用的实例

好的,但是您需要有一个要显示的类的引用。我不知道你想怎么做,但举例来说,你可以有一个带有类型字段的枚举,其中包含每种产品类型的类。然后,如果您有要在变量中显示的类,如class type=ProductA.class

使用Java流:

myList
.stream()
.filter(item -> item instance of DesiredClass)
.forEach(System.out::println);
myList
.stream()
.filter(item -> item.getClass().equals(type))
.forEach(System.out::println);
没有溪流:

for(Superclass item: myList){
  if(item instanceof DesiredClass){
    System.out.println(item.toString())
  }
}
for(Superclass item: myList){
  if(item.getClass().equals(type)){
    System.out.println(item.toString())
  }
}
编辑2:


如何将此作为一种方法编写

好的,假设您有这样一个枚举:

enum ProductType {
    PRODUCT_A(ProductA.class),
    PRODUCT_B(ProductB.class);

    public Class type;

    ProductTypes(Class type) {
        this.type = type;
    }
}
那么你的方法是:

void displayProductOfType(ProductType typeOfProduct, ArrayList<Product> list){
  Class typeClass = typeOfProduct.type;
  for(Product item: list){
    if(item.getClass().equals(typeClass)){
      System.out.println(item.toString())
    }
  }
}

您可以通过使用Java1.8流来实现这一点,但过程有点复杂。因为您有两个超类和许多子类,所以不能使用instanceof关键字。现在,Java的反射API进入了这个阶段。 首先,因为有两个超类,所以必须将它们包装为流中的对象类型。为此,您需要以下简单的包装方法:

public static <T> Object toObject(T obj) {
    return obj;
}
在这里,您有两个包含产品的ArrayList:

// Lists are not created here, you already have them
List<Peripheral> peripherals = new ArrayList<>();
List<Gadget> gadgets = new ArrayList<>();

此列表中的对象属于用户希望的类型。

您是否尝试自己解决此问题?这看起来像是家庭作业。我们不是来为你工作的。发布前请阅读SO指南。使用instanceof检查它是小工具还是外围设备我已经尝试解决这一问题好几天了。有很多子类,我不能多次使用instanceof Hello,欢迎使用Stackoverflow,我们可以帮助您,但我们不会代替您解决问题,请阅读,然后自由编辑您的问题。提前感谢是的,我理解这种方式,但是a有太多想要的类,所以我最好不要使用“如何编写此方法”的实例谢谢帮助,我以前尝试过,但由于某种原因它不起作用,我不知道变量类型是什么