【发布时间】:2021-10-07 16:28:53
【问题描述】:
我有一个对象商店如下。在主要功能中,我正在尝试处理一个列表。如果它的结果是一个空列表,那么我将创建一个默认列表,然后进一步处理它。我不知道如何创建一个默认列表,然后使用 java 8 流一起进一步处理它。 在第 1 节中,我正在处理一个列表。在第 2 节中,我正在创建第 1 节返回空列表的默认列表。在第 3 节中,我正在进一步处理第 1 节和第 2 节的结果。
class Shop {
String name;
String value;
public Shop(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
class Product {
List<Shop> list = new ArrayList<>();
public List<Shop> getList() {
return list;
}
public void setList(List<Shop> list) {
this.list = list;
}
}
public class Test {
public static void main(String[] args) {
Shop s1 = new Shop("zip", "32684");
Shop s2 = new Shop("loc", "abc");
Shop s3 = new Shop("zip", "32684");
Shop s4 = new Shop("brand", "lemom");
List<Shop> list = new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
Product p = new Product();
p.setList(list);
List<String> attributes = new ArrayList<>();
attributes.add("zip");
attributes.add("loc");
attributes.add("brand");
attributes.add("price");
//How can I create a default list (section 2) if section 1 returns empty list. And then combine section 1 ,2 and 3 togethr using Java 8 Streams
for (String attribute : attributes) {
//section 1
List<Shop> values = p.getList().stream()
.filter(shop -> attribute.equals(shop.getName()))
.collect(Collectors.toList());
//section 2
if (values.isEmpty()) {
values.add(new Shop("zip", "3728392"));
}
//section 3
List<String> list3 = new ArrayList<>();
for (Shop shop : values) {
list3.add(shop.getValue());
}
String result = String.join(",", list3);
}
}
}
【问题讨论】:
-
不要在
Collectors.toList()返回的列表上调用add方法,如 javadoc 所述 -> 不保证返回列表...。截至目前,toList使用ArrayList::new,但它可能会如here 所述改变。所以最好使用toCollection(ArrayList::new) -
也许您应该发布预期的结果。确保它是具有不同名称、属性等的完整示例。
标签: java java-8 java-stream