代码之家  ›  专栏  ›  技术社区  ›  Sasha Shpota A-Bag

在数组映射期间,用flatMap中的方法引用替换lambda

  •  9
  • Sasha Shpota A-Bag  · 技术社区  · 8 年前

    假设我们有 Customer 类别:

    public class Customer {
        private Car[] cars;
        // getter, setter, constructor
    }
    

    以及我们需要在汽车上绘制地图的客户集合。

    目前我是这样做的:

    Collection<Customer> customers = ...
    customers.stream().flatMap(
            customer -> Arrays.stream(customer.getCars())
    )...
    

    它工作得很好,但是 代码看起来并不优雅 . 我真的想用使用方法引用的代码来代替它,这些方法引用通常看起来更可读、更紧凑。但使用数组类型的字段会很困难。

    问题: 有没有办法提高 flatMap 调用以使其更可读/紧凑/清晰?

    3 回复  |  直到 8 年前
        1
  •  14
  •   Eran    8 年前

    您可以拆分 flatMap 呼叫两次- map 平面图 -每个接收一个方法参考:

    Collection<Customer> customers = ...
    customers.stream()
             .map(Customer::getCars)
             .flatMap(Arrays::stream)...
    
        2
  •  6
  •   Holger    8 年前

    只需将方法添加到 Customer 返回流 Car s、 使用典型的命名约定

    public Stream<Car> cars() {
        return Arrays.stream(cars);
    }
    

    然后,你可以像这样使用它

    customers.stream().flatMap(Customer::cars)
    

    通常,像数组这样的可变类型的属性应该小心处理。防止通过getter进行修改的唯一方法是复制。因此,提供了一种返回只读类型的替代方法,如 Stream ,不需要复制,除了制作 flatMap 整洁的

        3
  •  3
  •   Eugene    8 年前

    您可以使用:

     .map(Customer::getCars)
     .flatMap(Arrays::stream)
    

    但我不认为这比 elegant 无论如何。而且,将所有内容都作为这样的方法引用也会降低可读性,至少对我来说是这样。我应该解释一下为什么我觉得这不太可读,因为在阅读这段代码时,我现在需要了解两个阶段。为什么? map 已完成以及原因 flatMap 完成了-可能看起来很小。