当前位置: 首页 > 知识库问答 >
问题:

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

西门淮晨
2023-03-14

假设我们有一个客户类:

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

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

目前我是这样做的:

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

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

问题:有没有办法增强flatMap调用,使其更可读/紧凑/清晰?

共有3个答案

南门英飙
2023-03-14

您可以使用:

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

但我不认为这在任何方面都更优雅。而且像这样把所有东西都作为方法引用会使它的可读性降低,至少对我来说是这样。我应该解释一下为什么我觉得这不太可读,因为在阅读这段代码时,我现在需要理解两个阶段。为什么map完成了,为什么flatMap完成了,可能看起来很小。

郎曾笑
2023-03-14

只需将一个方法添加到返回Car的流的Client。使用典型的命名约定,它看起来像

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

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

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

通常,像数组这样的可变类型的属性应该小心处理。防止通过getter进行修改的唯一方法是复制。因此,提供一种返回只读类型(如)的替代方法,它不需要复制,除了使平面图整洁之外,还有其他用途。

谷梁建中
2023-03-14

您可以将flatMap调用拆分为两个调用-mapflatMap-每个调用都接收一个方法引用:

Collection<Customer> customers = ...
customers.stream()
         .map(Customer::getCars)
         .flatMap(Arrays::stream)...
 类似资料:
  • 我有一个包含错误列表的集合。我想通过一个键(UUID UserId)对它们进行分组。为此,我从以下答案中复制了代码:https://stackoverflow.com/a/30202075/4045364 Sonar Lint告诉我以下错误: 用方法引用替换此lambda<代码>- 我所尝试的: 基于这些问题:SONAR:用方法引用替换此lambda,可运行接口:用方法引用替换此lambda。(未

  • 当我在sonar中检查时,结果是: 它实际上指的是: 我的代码如下所示: 我试图改变它,但我得到了一个错误。有人知道如何改变它吗?

  • 索纳尔曲贝的解释是: 方法/构造函数引用比使用lambdas更紧凑、更易读,因此是首选。

  • 我错过了Java的一次讲座,主题是类、方法、构造函数等。作业是一项任务: 创建一个类Person,其对象描述人员,并且只包含两个字段:name(String)和生年(int)。在此类中,定义 > 建造师姓名和出生年份; 构造函数只取名称并将出生年份设置为默认值1990; 方法是如果此人是女性,则女性返回true(我们不太明智地假设只有女性和所有女性的名字以字母“a”结尾);否则该方法返回false

  • 我见过这样的阵列 我想把它变成这样 附:谢谢。

  • 问题内容: 我有一个字符串,例如。我想分别使用 JavaScript*和分别替换两个下划线。(因此)输出看起来像。该字符串可能包含多对下划线。 * 我所寻找的是一个方法来 无论是 运行在每场比赛,红宝石做它的方式的函数: 或 能够再次引用匹配的组,就像在ruby中一样: 有什么想法或建议吗? 问题答案: 哦,或者您也可以: