假设我们有一个客户
类:
public class Customer {
private Car[] cars;
// getter, setter, constructor
}
以及收集我们需要在汽车上绘制地图的客户。
目前我是这样做的:
Collection<Customer> customers = ...
customers.stream().flatMap(
customer -> Arrays.stream(customer.getCars())
)...
它工作得很好,但代码看起来并不优雅。我真的想用使用方法引用的代码来代替它,这些方法引用通常看起来更可读、更紧凑。但是使用数组类型的字段很难。
问题:有没有办法增强flatMap
调用,使其更可读/紧凑/清晰?
您可以使用:
.map(Customer::getCars)
.flatMap(Arrays::stream)
但我不认为这在任何方面都更优雅。而且像这样把所有东西都作为方法引用会使它的可读性降低,至少对我来说是这样。我应该解释一下为什么我觉得这不太可读,因为在阅读这段代码时,我现在需要理解两个阶段。为什么map
完成了,为什么flatMap
完成了,可能看起来很小。
只需将一个方法添加到返回Car
的流的Client
。使用典型的命名约定,它看起来像
public Stream<Car> cars() {
return Arrays.stream(cars);
}
然后,你可以像这样使用它
customers.stream().flatMap(Customer::cars)
通常,像数组这样的可变类型的属性应该小心处理。防止通过getter进行修改的唯一方法是复制。因此,提供一种返回只读类型(如流
)的替代方法,它不需要复制,除了使平面图
整洁之外,还有其他用途。
您可以将flatMap
调用拆分为两个调用-map
和flatMap
-每个调用都接收一个方法引用:
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中一样: 有什么想法或建议吗? 问题答案: 哦,或者您也可以: