假设资本 = 可见,小型股 = 不可见
AList = { A, a, B, C, b, c, D, d, e }; //可见和不可见。
BList = { C, D, B, A } ; //仅以不同的顺序可见。
根据您的要求
“因此,我们将 B 中包含的 A 中的每个下一个可见项目替换为 B 中的项目。我想知道通过 Guava 或 Stream API 是否有更漂亮的解决方案。”
你希望结果是 ->
CList = { C, a, D, B, b, c, A, d, e}; // 将 Visible 项按 B 的顺序排列
您可以先过滤 A 的 Stream 以仅显示可见项目,
然后将该项目 ID 替换为 B 在该相对位置的值。
关键是使用AtomicInteger
AtomicInteger index = new AtomicInteger();
itemA.stream().filter(a -> a.isVisible)
.forEach(a -> {
a.id = itemB.get(index.getAndIncrement()).id;
});
以下是完整代码:-
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;
public class StreamExample {
public static void main(String[] args) {
List<Item> itemA = new ArrayList<>();
List<Item> itemB = new ArrayList<>();
itemA.add(new Item("A"));
itemA.add(new Item("a", false));
itemA.add(new Item("B"));
itemA.add(new Item("C"));
itemA.add(new Item("b", false));
itemA.add(new Item("c", false));
itemA.add(new Item("D"));
itemA.add(new Item("e", false));
itemB.add(new Item("C"));
itemB.add(new Item("D"));
itemB.add(new Item("B"));
itemB.add(new Item("A"));
System.out.println("BEFORE: ");
System.out.println("A: ");
itemA.forEach(System.out::print);
System.out.println("\nB: ");
itemB.forEach(System.out::print);
AtomicInteger index = new AtomicInteger();
itemA.stream().filter(a -> a.isVisible)
.forEach(a -> {
a.id = itemB.get(index.getAndIncrement()).id;
});
System.out.println("\nAFTER: ");
System.out.println("A: ");
itemA.forEach(System.out::print);
}
}
class Item {
String id;
boolean isVisible = true;
public Item(String id) {
this.id = id;
}
public Item(String id, boolean isVisible) {
this.id = id;
this.isVisible = isVisible;
}
@Override
public String toString() {
return " {'" + id + '\'' +
'}';
}
}
以下是输出
BEFORE:
A:
{'A'} {'a'} {'B'} {'C'} {'b'} {'c'} {'D'} {'e'}
B:
{'C'} {'D'} {'B'} {'A'}
AFTER:
A:
{'C'} {'a'} {'D'} {'B'} {'b'} {'c'} {'A'} {'e'}