假设我们正在设计一家商店。我们的商店包含许多类型的产品(处理器,屏幕等)。我们构建一个界面并提示用户提供特定类型的产品(例如处理器),程序应该将所有处理器显示在屏幕上。有2个超类,外围设备和小工具。所有产品都是其中一个的子类。我们有两个arraylists(类型外围设备,类型小工具),包含每个类别的所有产品。问题是:如何显示仅所需类型的产品。
答案 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());
此列表中的对象属于用户期望的类型。