Lambda表达式和嵌套数组

时间:2017-08-03 15:54:52

标签: java lambda java-8 java-stream

我正在尝试用一些很好的lambda表达式来构建来自“customers”ArrayList的“desiredResult”。我以旧的丑陋方式“for”循环实现它。我知道应该有一个很好的单行,但我想不出任何方法 - 嵌套数组进入我的方式。

Iterable<List<?>> params;
Customer customer1 = new Customer("John", "Nowhere");
Customer customer2 = new Customer("Alma", "Somewhere");
Customer customer3 = new Customer("Nemo", "Here");
Collection<Customer> customers = new ArrayList<>();
customers.add(customer1);
customers.add(customer2);
customers.add(customer3);

Collection<List<?>> desiredResult = new ArrayList<>();
for (Customer customer : customers) {
    List<Object> list = new ArrayList<>();
    list.add(customer.getName());
    list.add(customer.getAddress());
    list.add("VIP");
    desiredResult.add(list);
}
params = desiredResult;

2 个答案:

答案 0 :(得分:4)

我只是使用Arrays.asList来创建内部列表,这使问题变得更加简单:

Collection<List<?>> desiredResult = 
    customers.stream()
             .map(c -> Arrays.asList(c.getName(), c.getAddress(), "VIP"))
             .collect(Collectors.toList());

如果您绝对必须拥有ArrayList,只需将Arrays.asList电话打包即可。

答案 1 :(得分:3)

这是一个建议:

Collection<List<?>> desiredResult = customers.stream()
         .map(MyClass::customerToList)
         .collect(toList());

我已将列表构建提取到一个单独的方法中以提高可读性 - 相应的方法如下所示:

private static List<Object> customerToList(Customer c) {
  List<Object> list = new ArrayList<>();
  list.add(c.getName());
  list.add(c.getAddress());
  list.add("VIP");      
  return list;
}
相关问题