假设我们有一个国家列表:List
USA
Alabama
Alaska
Arizona
...
Germany
Baden-Württemberg
Bavaria
Brandenburg
...
在“纯旧”Java中,我们可以计算所有区域,例如:
List<Country> countries = ...
int regionsCount = 0;
for (Country country : countries) {
if (country.getRegions() != null) {
regionsCount += country.getRegions().size();
}
}
是否有可能使用Java8 Stream API实现相同的目标?我想到了类似的东西,但我不知道如何使用流API的
count()
方法计算嵌套列表的项目:
countries.stream().filter(country -> country.getRegions() != null).???
您甚至可以使用flatMap()如下:
countries.stream().map(Country::getRegions).flatMap(List::stream).count();
where,
map(Country::getRegions) = returns a Stream<List<Regions>>
flatMap(List::stream) = returns a Stream<Regions>
您可以将每个国家映射到多个地区,然后使用总和减少结果:
countries.stream()
.map(c -> c.getRegions() == null ? 0 : c.getRegions().size())
.reduce(0, Integer::sum);
您可以使用map()
获取地区列表的流,然后使用mapToInt
获取每个国家的地区数。之后,使用sum()获取IntStream中所有值的总和:
countries.stream().map(Country::getRegions) // now it's a stream of regions
.filter(rs -> rs != null) // remove regions lists that are null
.mapToInt(List::size) // stream of list sizes
.sum();
注意:在过滤之前使用getRegions的好处是,您不需要多次调用getRegions。
我需要计算下一个列表中的元素,我有一个listartif列表,对于它们的每个元素,我都有一个发现列表,对于每个发现对象,我都有一个名为isChecked的字段,所以我需要计算列表中所有检查过的发现。我已经做了下一个,但是我得到了列表中元素的总数。 有什么想法吗? 谢谢
问题内容: 一个作业有一个真正的问题(和头痛)… 我在入门编程班上,我必须写一个函数,给定一个列表,该函数将返回其达到的“最大”深度。例如:[1,2,3]将返回1,[ 1,[2,3]]将返回2 … 我已经编写了这段代码(这是我能得到的最好的T_T) 但是,它显然不像应有的那样工作,因为如果存在不计入最大深度的列表,它仍然会增加计数器… 例如:当我将函数与[1,2,[3,4],5,[6],7]一起使
问题内容: 在简单的清单中,下面的检查很简单: 但如果是列表列表,例如: 为了退货该如何解决? 问题答案: 使用内置功能尝试此操作。这是最惯用的解决方案,并且效率很高,因为一旦找到第一个匹配项,就会短路并停止:
问题内容: 我有一个对象A的列表。此列表中的每个对象A都包含对象B的列表,而对象B包含对象C的列表。对象C包含一个属性名称,我想使用它使用Java 8进行过滤。 如何使用流在Java 8中编写以下代码以避免嵌套循环: 问题答案: 您可以使用两个,然后使用a,然后可以选择第一个,或者如果没有结果返回:
我有一个对象列表A。此列表中的每个对象A都包含对象B的列表,对象B包含对象C的列表。对象C包含一个属性名称,我想使用java 8进行过滤。 如何使用流在java8中编写下面的代码以避免嵌套循环:
我有以下列表: 我需要计算累计总和-列表含义 我想使用Java流API进行计算,以便我可以使用Spark实现它以进行大数据计算。我在JavaStreams中很天真,我尝试了几个表达式,但没有一个是有效的,等效的结构代码应该是这样的: