Java 8单独的列表元素类别 - java

给定我有一个列表,所有列表都继承自同一基类:

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类的实现无关,那么实现这种行为的最佳方法是什么?

问候

[编辑:]谢谢您的所有答复。我今天学到了一些新东西。

参考方案

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

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如何将正确的任务分配给正确的线程? 参考方案 …