在Java中我可以这样做:
List<String> stringList = getRandomStrings(100_000, 1000);
IntSummaryStatistics stats =
stringList.stream()
.filter(Objects::nonNull)
.mapToInt(String::length)
.summaryStatistics();
System.out.println(stats);
Run Code Online (Sandbox Code Playgroud)
输出是:
IntSummaryStatistics{count=100000, sum=49868013, min=0, average=498.680130, max=999}
Run Code Online (Sandbox Code Playgroud)
linq具有相同的功能吗?或者我必须单独计算所有内容?
Java没有这一气呵成,它看起来像在C#中,你必须计算出所有成分Average(),Count(),Sum(),Min()和Max()分别.
Dou*_*las 13
我不知道.NET内置的任何东西都是等效的,但您可以使用AggregateLINQ 轻松实现它.这符合您只需枚举源集合一次的要求.
var ints = new List<int>() { 1, 2, 3, 4, 677, 8 };
var summary = ints.Aggregate(
seed: (
count: 0,
sum: 0,
min: int.MaxValue,
max: int.MinValue),
func: (acc, x) => (
count: acc.count + 1,
sum: acc.sum + x,
min: Math.Min(acc.min, x),
max: Math.Max(acc.max, x)),
resultSelector: acc => (
acc.count,
acc.sum,
acc.min,
acc.max,
avg: (double)acc.sum / acc.count));
Console.WriteLine(
$"count = {summary.count}, " +
$"sum = {summary.sum}, " +
$"min = {summary.min}, " +
$"max = {summary.max}, " +
$"average = {summary.avg}");
Run Code Online (Sandbox Code Playgroud)
如果您的集合非常大并且您想并行化其处理,则可以使用此重载:
var summary = ints.AsParallel().Aggregate(
seed: (
count: 0,
sum: 0,
min: int.MaxValue,
max: int.MinValue),
updateAccumulatorFunc: (acc, x) => (
count: acc.count + 1,
sum: acc.sum + x,
min: Math.Min(acc.min, x),
max: Math.Max(acc.max, x)),
combineAccumulatorsFunc: (acc1, acc2) => (
count: acc1.count + acc2.count,
sum: acc1.sum + acc2.sum,
min: Math.Min(acc1.min, acc2.min),
max: Math.Max(acc1.max, acc2.max)),
resultSelector: acc => (
acc.count,
acc.sum,
acc.min,
acc.max,
avg: (double)acc.sum / acc.count));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |