gpt4 book ai didi

Java 8 按类分离列表元素

转载 作者:搜寻专家 更新时间:2023-11-01 01:31:09 24 4
gpt4 key购买 nike

假设我有一个全部继承自同一基类的项目列表:

class Item {
protected String name;

public Item(String name) {

this.name = name;
}

getName() {

return name;
}
}

class ItemA extends Item {...}
class ItemB extends Item {...}

List<Item> itemList = Arrays.asList(new ItemA("itemA"), new ItemB("itemB"));

在我的例子中,我无法控制这些类的实现方式,但我需要将列表分成两个不同的列表,其中包含相应元素的名称。

这是第一次尝试包含大量 ifinstanceof 语句的解决方案:

List<String> itemAList = new ArrayList<>();
List<String> itemBList = new ArrayList<>();

itemList.forEach(item -> {

if(item instanceof ItemA) {

itemAList.add(item.getName());
}
else if(item instanceof ItemB) {

itemBList.add(item.getName());
}
});

所以这行得通,但我考虑了如何避免 if 语句。因为我使用的是 Java 8,所以我可以这样做:

List<String> itemAList = itemList.stream()
.filter(ItemA.class::isInstance)
.map(item -> item.getName())
.collect(Collectors.toList());

List<String> itemBList = itemList.stream()
.filter(ItemB.class::isInstance)
.map(item -> item.getName())
.collect(Collectors.toList());

这也有效,但这意味着我必须处理列表两次。

正如我所说,我与 Item 类的实现无关,那么实现这种行为的最佳方式是什么?

问候

[edit:] 感谢您的所有回复。我今天学到了一些新东西。

最佳答案

您可以根据元素的类别对内容进行分组:

Map<Class, List<String>> grouped = itemList.stream()
.collect(Collectors.groupingBy(Item::getClass,
Collectors.mapping(Item::getName, Collectors.toList())));

并将其访问为:

List<String> itemAList = grouped.get(ItemA.class);

关于Java 8 按类分离列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55301160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com