一个存储容器中大约有500万条记录。我需要在一个集合对象中获取它们。我得到了下面的列表:
[
{"Record1":"Java","Version":"6","Size":"56"},
{"Record2":"Java","Version":"6","Size":"58"},
{"Record3":"Java","Version":"6","Size":"46"},
{"Record4":"Java","Version":"6","Size":"56"},
{"Record5":"Java","Version":"6","Size":"29"},
{"Record6":"Python","Version":"3.8","Size":"15"},
{"Record7":"Python","Version":"3.8","Size":"20"},
{"Record8":"Python","Version":"3.8","Size":"23"},
{"Record9":"Python","Version":"3.8","Size":"32"},
{"Record10":"Python","Version":"3.8","Size":"31"}
]
预期结果(需要计算特定“版本”的总大小):
[
{"Record1":"Java","Version":"6","Size":"245"},
{"Record2":"Python","Version":"3.8","Size":"121"}
]
“Java”的总尺寸示例:
"56" "58" "46" "56" "29"="245"
如何使用Java 8实现这一点?
首先,您应该谨慎行事,并考虑将大量记录加载到java应用程序中的内存需求和网络i/o。试着找到一种在存储容器中进行计算的方法。
对于java,您可以使用以下内容:
import lombok.Data;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class StackoverflowQuestion {
@Data
static class Row {
private final Info info;
private final Integer size;
}
@Data
static class Info {
private final String platform;
private final String version;
}
public static void main(String[] args) {
List<Row> rows = Arrays.asList(
new Row(new Info("Java", "8"), 10),
new Row(new Info("Java", "8"), 20),
new Row(new Info("Java", "11"), 30),
new Row(new Info("Java", "11"), 40),
new Row(new Info("Python", "3.3"), 50),
new Row(new Info("Python", "3.3"), 60),
new Row(new Info("Python", "3.8"), 70)
);
Map<Info, IntSummaryStatistics> collect = rows.stream()
.collect(Collectors.groupingBy(Row::getInfo, // Info class will be the key
Collectors.mapping(Row::getSize, // what to do with Size?
Collectors.summarizingInt(Integer::intValue)))); // sum it
collect.forEach((key, value) -> System.out.println(key + ": " + value.getSum()));
// output:
// Info(platform=Python, version=3.8): 70
// Info(platform=Java, version=11): 70
// Info(platform=Python, version=3.3): 110
// Info(platform=Java, version=8): 30
}
}
隆伯克。这里的数据用作所有参数构造函数equals、hashCode和toString的快捷方式。equals,分组需要hashCode。
想改进这个问题吗?通过编辑这篇文章添加细节并澄清问题。 存储容器中大约有500万记录。我需要在集合对象中获取它们。我得到以下列表: 预期结果(需要计算特定“版本”的总大小): “Java”的总尺寸示例: "56""58""46""56""29"="245" 如何使用Java 8实现这一点?
Java标准库中的大多数集合(如ConcurrentLinkedQueue、Concurrent LinkedDequeue和ConcurrntSkipListSet)的文档都附带以下免责声明: 注意,与大多数集合不同,size方法不是一个恒定时间的操作。由于这些集合的异步性质,确定元素的当前数量需要遍历元素,因此如果在遍历过程中修改了集合,可能会报告不准确的结果。 那是什么意思?为什么他们不能保
问题内容: 我正在尝试计算光盘上文件的大小。在Java的7本可以用做Files.walkFileTree如图我的答案在这里。 但是,如果我想使用java-8流来执行此操作,则它将适用于某些文件夹,但不适用于所有文件夹。 上面的代码可以很好地用于路径,但是会抛出以下异常 我了解它的来源以及如何使用Files.walkFileTree API避免它。 但是如何使用Files.walk() API 避免
我希望在另一个函数中使用此函数。这个“addTotal”函数的作用是返回某个客户的每个银行账户的总余额。我通过插入“return total对账单,它只获取第一个银行账户的余额。对此有什么建议吗?
我在UITableView中使用Auto Layout和size类,其中单元格根据其内容自调整大小。为此,我使用的方法是,对于每种类型的单元格,您都要保留该单元格的屏幕外实例,并在其上使用来确定正确的行高——这种方法在StackOverflow帖子和其他地方得到了很好的解释。 在我开始使用大小班级之前,这种方法非常有效。具体来说,我为常规宽度布局中的文本定义了不同的边距约束常数,因此iPad上的文
我有一个集合,其中添加了两个不同的对象。插入后,我以这样一种方式更改其中一个对象,使两个对象相等(由object类中重写的equals方法验证)。此时,我在一个集合中有两个重复的元素。现在,我尝试将这两个重复的对象添加到一个新的集合中,即使equals方法为它们返回true,我仍然能够添加它们。下面是相同的代码。谁能告诉我,我到底错过了什么?