通过Java中的公共属性匹配来自不同类型的对象

时间:2017-08-25 18:37:40

标签: java collections java-8 match java-stream

我有以下课程:

abstract class Executor {
String executorType;

public Executor(String executorType) {this.executorType = executorType;}

public void execute(String dataContent);
}

class Data {
String dataType;
String dataContent;
}

给定一个Datas列表和一个Executor列表(扩展Executor的具体内容),我希望每个执行器只调用与其类型相同类型的数据执行。换句话说,只有executor.executorType == data.dataType

,执行程序才会对数据执行

如何使用Java 8提供的流,收集器和其他东西,如何以及良好的性能做到这一点?

这是我做过的一个例子,但我认为我可以做得更好:

(注: 1.在我的示例中,我在执行程序和数据之间创建了一个映射,可以在其上运行execute()方法。但是,如果有一个跳过地图创建并立即运行execute()的解决方案,那就更好了 2.在我的例子中,我假设Executor是一个具体的类,而不是抽象的,只是为了方便。

List<Executor> executorList = Arrays.asList(new Executor("one"), new Executor("two"), new Executor("three"));
List<Data> dataList = Arrays.asList(new Data("one","somecontent"), new Data("two","someOtherContent"), new Data("one","longContent"));
Map<List<Executor>, List<Data>> stringToCount = dataList.stream().collect(
            Collectors.groupingBy(t-> executorList.stream().filter(n -> n.executorType.equals(t.getName())).collect(Collectors.toList())));

1 个答案:

答案 0 :(得分:0)

  

如何使用Java 8提供的流,收集器和其他东西,如何以及良好的性能做到这一点?

那么你的目标是什么?良好的性能还是使用Java 8 Streams?

对于流,它将类似于:

dataList
    .forEach(data -> executorList
        .stream()
        .filter(executor -> Objects.equals(data.dataType, executor.executorType))
        .findAny()
        .map(executor -> executor.execute(data.dataContent)));

不确定语法,但也不确定。

但我实际上先Map<String, Executor> Executor.executorType,然后executors.get(data.dataType)。你也可以实现一个什么都不做的VoidExecutor并调用

executors.getOrDefault(data.dataType, VoidExecutor.INSTANCE).execute(data.dataContent);

使用哈希映射,您可能会期待查找时间。