java - 用于列表迭代的 Java 8 Streams
问题描述
我有一个HashMap
包含List<Dto>
和List<List<String>>
:
Map<List<Dto>, List<List<String>>> mapData = new HashMap();
和一个Arraylist<Dto>
。
我想遍历这个映射,获取键-key1、key2 等并从中获取值并将其设置为 Dto 对象,然后将其添加到列表中。因此,我能够使用 foreach 成功迭代并将其添加到列表中,但无法使用 Java 8 正确完成它。所以我需要一些帮助。这是示例代码
List<DTO> dtoList = new ArrayList();
DTO dto = new DTO();
mapData.entrySet().stream().filter(e->{
if(e.getKey().equals("key1")){
dto.setKey1(e.getValue())
}
if(e.getKey().equals("key2")){
dto.setKey2(e.getValue())
}
});
这e.getValue()
是 List<List<String>>()
第一件事,我需要遍历它来设置值。其次是我需要将 dto 添加到 Arraylist dtoList。那么如何实现这一点。
我尝试的基本片段没有添加到 List 有键的 HashMap,multiList 有值,Dto 列表是我最后添加的地方
for(List<Dto> dtoList: column) {
if ("Key1".equalsIgnoreCase(column.getName())) {
index = dtoList.indexOf(column);
}
}
for(List<String> listoflists: multiList) {
if(listoflists.contains(index)) {
for(String s: listoflists) {
dto.setKey1(s);
}
dtoList.add(dto);
}
}
解决方案
请参阅https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html
流操作分为中间操作和终端操作,组合起来形成流管道。一个流管道由一个源(例如一个集合、一个数组、一个生成器函数或一个 I/O 通道)组成;后跟零个或多个中间操作,例如 Stream.filter 或 Stream.map;和一个终端操作,例如 Stream.forEach 或 Stream.reduce。
所以在你上面的片段中,filter
并没有真正做任何事情。要触发它,您需要collect
在最后添加一个操作。请注意,过滤器 lambda 函数首先需要返回一个布尔值,以便您的代码进行编译。
mapData.entrySet().stream().filter(entry -> {
// do something here
return true;
}).collect(Collectors.toList());
当然,您不需要滥用中间操作 - 或生成一堆新对象 - 对于简单的任务,这样的事情就足够了:
mapData.entrySet().stream().forEach(entry -> {
// do something
});
推荐阅读
- r - 忽略特定警告,但不忽略 R 中的其他警告
- c++ - 在 C++ 类中初始化静态值彼此相等
- sharepoint-online - 我们可以使用逻辑应用来获取 Sharepoint 在线网站上的点击次数吗
- qt - Qt Creator:没有可用的文档
- asp.net-core - 异步等待返回任务 Null .Net Core
- javascript - 循环遍历 v-for 中的数组子集
- docker - PhpStorm + Docker 正在复制供应商文件
- r - 在R中将周末日期更改为工作日日期
- django - 作为认证用户的 django-allauth 测试请求
- r - 是否有任何明确的保证 dplyr 操作保留行顺序?