【发布时间】:2021-08-28 08:59:09
【问题描述】:
我有这个适用于 Arraylist 的代码 数组列表中的每个元素都需要由 ArithmeticBBB 和 ArithmeticCCC 处理 并创建 2 个返回到流中的元素 我正在使用 stream = stream.map(a::work);在循环 。 或使用 flatMap
class ArithmeticBBB implements ArithmeticManagerStream.ArithmeticAction {
@Override
public String arithmetic(String n) {
String ss = n+" 2" + " ,Thread ID:" +Thread.currentThread().getId();
return ss;
}
}
class ArithmeticCCC implements ArithmeticManagerStream.ArithmeticAction {
@Override
public String arithmetic(String n) {
String ss = n+" 3" + " ,Thread ID:" +Thread.currentThread().getId();
return ss;
}
}
public class ArithmeticManagerStream {
private List<String> integerList = null;
private List<String> resultArray = null;
public ArithmeticManagerStream(List<String> dataFromUser) {
this.integerList = dataFromUser;
}
public List<String> invokerActions(List<ArithmeticAction> actions) throws
InterruptedException {
Stream<String> stream = integerList.parallelStream();
for (final ArithmeticManagerStream.ArithmeticAction a : actions) {
stream = stream.flatMap(str -> actions.stream().map(b -> b.arithmetic(str)));
}
return resultArray = stream.collect(Collectors.toList());
}
public interface ArithmeticAction {
String arithmetic(String n);
}
public static void main(String[] args) {
List<ArithmeticAction> actions = new ArrayList();
actions.add(new ArithmeticBBB());
actions.add(new ArithmeticCCC());
List<String> intData = new ArrayList<>();
intData.add("1");
intData.add("2");
intData.add("3");
ArithmeticManagerStream arithmeticManagerStream = new ArithmeticManagerStream(intData);
try {
List<String> result = arithmeticManagerStream.invokerActions(actions);
System.out.println("***********************************************");
for(String i : result) {
System.out.println(i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
目前,如果你运行这个程序,你会看到结果是连接到字符串的。
1 2 ,Thread ID:12 2 ,Thread ID:12
1 2 ,Thread ID:12 3 ,Thread ID:12
1 3 ,Thread ID:12 2 ,Thread ID:12
1 3 ,Thread ID:12 3 ,Thread ID:12
2 2 ,Thread ID:1 2 ,Thread ID:1
2 2 ,Thread ID:1 3 ,Thread ID:1
2 3 ,Thread ID:1 2 ,Thread ID:1
2 3 ,Thread ID:1 3 ,Thread ID:1
3 2 ,Thread ID:13 2 ,Thread ID:13
3 2 ,Thread ID:13 3 ,Thread ID:13
3 3 ,Thread ID:13 2 ,Thread ID:13
3 3 ,Thread ID:13 3 ,Thread ID:13
我需要每个元素都在自己的元素中,例如:
1 2 ,Thread ID:12
1 2 ,Thread ID:12
1 3 ,Thread ID:12
1 3 ,Thread ID:12
2 2 ,Thread ID:1
2 2 ,Thread ID:1
2 3 ,Thread ID:1
2 3 ,Thread ID:1
3 2 ,Thread ID:13
3 2 ,Thread ID:13
3 3 ,Thread ID:13
3 3 ,Thread ID:13
【问题讨论】:
-
您是否尝试生成与
Iwork中的Iwork对象一样多的列表?如果没有,您将如何处理多个 map 结果?如果您希望通过应用这些操作产生多个列表,则需要多个流。 -
@ernest_k 我用最终目标更新了问题
-
@Holger 我更新了问题
-
那么您只需要
flatMap。这有点像笛卡尔积。 -
@ernest_k 你能举个例子吗?感谢重播
标签: java multithreading parallel-processing java-stream