mat*_*th5 1 java list java-8 java-stream
在Java中,如何使用列表中的列表来映射和获取类成员列表。
public class CustomerSales {
public List<Product> productList;
....
}
public class Product {
public List<ProductSubItem> productSubItemList
....
}
public class ProductSubItem {
public String itemName;
Run Code Online (Sandbox Code Playgroud)
试图:
然而,这并没有得到itemName。我正在寻找一种干净有效的方法,理想情况下可能想尝试 4-5 级深度,但为了简单起见,问题只有 3 级,等等
List<String> itemNameList = customerSales.productList.stream()
.map(p -> p.productSubItemList())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我正在使用 Java 8。
尝试使用此资源:仍然不走运,如何使用 Java 8 Stream 从某些类属性中获取列表?
将子列表转换为流,并使用 flatMap 将元素流流转换为元素流。
例子:
package x.mvmn.demo;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Demo {
public static class CustomerSales {
public List<Product> productList;
}
public static class Product {
public List<ProductSubItem> productSubItemList;
public List<ProductSubItem> getProductSubItemList() {
return productSubItemList;
}
}
public static class ProductSubItem {
public String itemName;
public ProductSubItem(String itemName) {
this.itemName = itemName;
}
public String getItemName() {
return itemName;
}
}
public static void main(String args[]) throws Exception {
// Setup mock data
CustomerSales customerSales = new CustomerSales();
Product p1 = new Product();
p1.productSubItemList = Arrays.asList(new ProductSubItem("p1 item one"), new ProductSubItem("p1 item two"));
Product p2 = new Product();
p2.productSubItemList = Arrays.asList(new ProductSubItem("p2 item one"), new ProductSubItem("p2 item two"));
customerSales.productList = Arrays.asList(p1, p2);
// Get list of item names
System.out.println(customerSales.productList.stream().map(Product::getProductSubItemList).flatMap(List::stream)
.map(ProductSubItem::getItemName).collect(Collectors.toList()));
// Alternative syntax
System.out.println(customerSales.productList.stream().flatMap(product -> product.productSubItemList.stream())
.map(subItem -> subItem.itemName).collect(Collectors.toList()));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
[p1 item one, p1 item two, p2 item one, p2 item two]
[p1 item one, p1 item two, p2 item one, p2 item two]
Run Code Online (Sandbox Code Playgroud)