我有以下课程:
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())));
答案 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);
使用哈希映射,您可能会期待查找时间。