Java Streams:获取列表中一组字符的总和

Java Streams:获取列表中一组字符的总和,java,java-stream,Java,Java Stream,我有这个数据结构和一些示例内容: List aList=List.of(集合的('a','b','c')、集合的('a','b','c')、集合的('a','b','c')、集合的('a')、集合的('b')); 我想检索所有字符的总和。在这个例子中,它是 3 + 3 + 3 + 1 + 1 = 11 我可以这样解决这个问题: int和=0; for(设置aSet:aList){ sum+=aSet.size(); } 但是,我几乎可以肯定,有一种更聪明的方法可以通过流来实现这一点。我就是

我有这个数据结构和一些示例内容:

List aList=List.of(集合的('a','b','c')、集合的('a','b','c')、集合的('a','b','c')、集合的('a')、集合的('b'));
我想检索所有字符的总和。在这个例子中,它是

3 + 3 + 3 + 1 + 1 = 11
我可以这样解决这个问题:

int和=0;
for(设置aSet:aList){
sum+=aSet.size();
}
但是,我几乎可以肯定,有一种更聪明的方法可以通过流来实现这一点。我就是搞不懂。
有人有主意吗 您应该将集合映射到它们的大小,然后可以应用
sum()

或者按照khelwood的建议:

aList.stream().mapToInt(Set::size).sum();

首先将列表映射到大小,然后使用0的和减少,甚至使用
Set::size
甚至更好;这当然让人觉得更地道<代码>更精确
-什么?没有比这更精确的了。这是相同的代码,唯一的区别是关于哪种形式“看起来更好”的风格辩论。或者甚至是
Collection::size
,以便更广泛地使用。@rzwitserroot你说的不是真的。方法引用(例如,
X::prop
)不会创建新的匿名方法,而是执行所指向的方法。另一方面,lambda
x->x.prop()
将创建一个新的匿名方法并执行该方法。基于。“不会创建新的匿名方法,而是执行指向的方法。”这与“精确”一词无关。如果你说的更“有效”,我想我们可以挑剔这个词的意思,但至少它是适用的。你能解释一下为什么否决这个答案,尽管我知道为什么……我也不知道为什么?我在回答,然后显然有人在回答:DI可以猜到:这是一个糟糕的实现。转换为
IntStream
和求和在各个方面都是惯用的和优越的。我认为否决票是针对非常糟糕的答案,而不是针对不完美的答案,老实说,我不在乎我的名声,但也不像最糟糕的那样solution@dbl将鼠标悬停在“向下投票”按钮上可以省去它的作用:“这个答案没有用”。上面没有写“这个答案真的很糟糕”。这个答案的全部要点是展示答案(它不包括上下文或解释,这很好,不是所有的答案都需要),但因为它只是一个基本的“这就是怎么做”答案,考虑到这不是惯用的方式,它是没有用的。它并没有真正教会提问者有关概念的知识,也没有向他们展示一个次优的解决方案。diskostu,我知道这对于一行来说有点太大了,但当这涉及到大局而不是特定的问题时,我不想添加答案<代码>数组.stream(input.split(“\n\n”).mapToInt(group->(int)IntStream.rangeClosed('a','z')).filter(c->Arrays.stream(group.split(“\n”)).anyMatch(entry->entry.indexOf((char)c)>=0)).count()).sum()d6p2使用相同的代码段,但它涉及
c->Arrays.stream(splited.split(“\n”)).allMatch(
而不是
anyMatch
:)
aList.stream().mapToInt(Set::size).sum();
aList.stream().map(Set::size).reduce(0, Integer::sum)