首页 > 解决方案 > 用于列表迭代的 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);
}            
}

标签: javalistjava-8iteration

解决方案


请参阅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
    });

推荐阅读