![](/img/trans.png)
[英]Best way to replace multiple FOR loops with stream api in Java
[英]Best way to replace an element of a Collection with multiple elements in Java
我有一個字符串值集合。 如果值之一是“ *”,我想用另外3個值代替,例如“ X”,“ Y”和“ Z”。
換句話說,我想將[“ A”,“ B”,“ *”,“ C”]轉換為[“ A”,“ B”,“ X”,“ Y”,“ Z”,“ C”]。 順序無關緊要,因此只需刪除其中一個並添加其他內容即可。 使用該示例,可以想到以下這些方法:
Collection<String> additionalValues = Arrays.asList("X","Y","Z"); // or set or whatever
if (attributes.contains("*")) {
attributes.remove("*");
attributes.addAll(additionalValues);
}
要么
attributes.stream()
.flatMap(val -> "*".equals(val) ? additionalValues.stream() : Stream.of(val))
.collect(Collectors.toList());
最有效的方法是什么? 再說一次,順序並不重要,理想情況下,我想刪除重復項(因此可能是流中的distinct()或HashSet?)。
我會以與您的第一種方式非常相似的方式進行操作:
if (attributes.remove("*")) {
attributes.addAll(additionalValues);
}
您不需要單獨的remove
並contains
對正確實現的collection的調用:
[
Collection.remove(Object)
]從此集合中移除指定元素的單個實例( 如果存在) (可選操作)。 更正式地講,如果此集合包含一個或多個這樣的元素,則刪除元素(e == null?e == null:o.equals(e))。 如果此集合包含指定的元素 (或者等效地,如果此集合由於調用而更改),則返回true 。
我認為第二個更好。 Arrays.asList("X","Y","Z")
檢索ArrayList
即數組。 替換其中的值不是很好。
在一般情況下,如果您想修改一個集合(例如,將*
替換為X
, Y
和Z
),請以某種方式創建新集合。
如果要修改集合本身,請查看LinkedList
。
使用流:
public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {
return attributes.stream()
.map(val -> value.equals(val) ? additionalValues.stream() : Stream.of(val))
.flatMap(Function.identity())
.collect(Collectors.toList());
}
不使用流
public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {
List<String> res = new LinkedList<>();
for (String attribute : attributes) {
if (value.equals(attribute))
res.addAll(additionalValues);
else
res.add(attribute);
}
return res;
}
演示:
List<String> attributes = Arrays.asList("A", "B", "*", "C");
List<String> res = replace(attributes, "*", Arrays.asList("X", "Y", "Z")); // ["A", "B", "X", "Y", "Z", "C"]
為了獲得最佳性能,並在正確的位置插入替換值,請使用indexOf(o)
, remove(index)
和addAll(index, c)
:
演示版
List<String> attributes = new ArrayList<>(Arrays.asList("A", "B", "*", "C"));
Collection<String> additionalValues = Arrays.asList("X","Y","Z");
int idx = attributes.indexOf("*");
if (idx != -1) {
attributes.remove(idx);
attributes.addAll(idx, additionalValues);
}
System.out.println(attributes);
輸出量
[A, B, X, Y, Z, C]
如果順序無關緊要,請使用remove(o)
的返回值:
if (attributes.remove("*"))
attributes.addAll(additionalValues);
輸出量
[A, B, C, X, Y, Z]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.