如何通过arraylist

时间:2018-03-29 10:00:49

标签: java arraylist

假设我们正在设计一家商店。我们的商店包含许多类型的产品(处理器,屏幕等)。我们构建一个界面并提示用户提供特定类型的产品(例如处理器),程序应该将所有处理器显示在屏幕上。有2个超类,外围设备和小工具。所有产品都是其中一个的子类。我们有两个arraylists(类型外围设备,类型小工具),包含每个类别的所有产品。问题是:如何显示所需类型的产品。

2 个答案:

答案 0 :(得分:0)

使用Java Streams:

myList
.stream()
.filter(item -> item instance of DesiredClass)
.forEach(System.out::println);

没有溪流:

for(Superclass item: myList){
  if(item instanceof DesiredClass){
    System.out.println(item.toString())
  }
}

修改1:

  

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

的实例

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

的变量中显示该类

使用Java Streams:

myList
.stream()
.filter(item -> item.getClass().equals(type))
.forEach(System.out::println);

没有溪流:

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())
    }
  }
}

答案 1 :(得分:0)

您可以通过使用Java 1.8流来实现这一点,但这个过程有点复杂。由于您有2个超类和许多子类,因此无法使用instanceof关键字。现在,那是Java的Reflection API进入的时候。

首先,因为有2个超类,所以你必须将它们包装成流中的Object类型。要做到这一点,您需要这个简单的包装器方法:

public static <T> Object toObject(T obj) {
    return obj;
}

接下来,您应该使用Map来存储具有适当键的所有子类的类型。此地图中的值类型为Class<?>。键的类型由您决定。我们假设它们是String。例如,如果用户键入“Processor”,则应表示类型Processor。创建地图并将所有子类与其关键字放在一起。

Map<String, Class<?>> types = new HashMap<>();

types.put("Processor", Processor.class);
// Other subclasses put here...

在这里,您有两个包含产品的ArrayList:

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

然后,获取用户的输入并查询地图以获得所需的类型:

Class<?> desiredType = types.get("search_keyword");

最后,将两个列表合并为一个流(基类型为Object),并过滤此流以收集所需类型的产品:

List<Object> processors = Stream
    .concat(peripherals.stream().map(p -> toObject(p)), gadgets.stream().map(g -> toObject(g)))
    .filter(obj -> desiredType.isAssignableFrom(obj.getClass()))
    .collect(Collectors.toList());

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