给定我有一个列表,所有列表都继承自同一基类:
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"));
就我而言,我无法控制这些类的实现方式,但是我需要将列表分为两个包含相应元素名称的不同列表。
这是包含大量if
和instanceof
语句的解决方案的首次尝试:
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
类的实现无关,那么实现这种行为的最佳方法是什么?
问候
[编辑:]谢谢您的所有答复。我今天学到了一些新东西。
参考方案
您可以根据元素的类别对内容进行分组:
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`Stream`可以并行运行,甚至不需要您吗? - java如我所见,在使用Java 8 Stream时,显而易见的代码无论是“对象”流还是原始流(即IntStream和朋友)都将仅使用:someStreamableResource.stream().whatever() 但是,然后,相当多的“流媒体资源”也有了.parallelStream()。读取javadoc时不清楚的是.stream()流是否始终是顺序的,以…
与哪些运算符>>兼容 - java我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…
JAVA 8具有任何匹配属性的对象的过滤器列表 - java我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…
Java:正则表达式模式匹配器是否有大小限制? - java我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)
Java:线程池如何将线程映射到可运行对象 - java试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …