当前位置: 首页 > 知识库问答 >
问题:

基于列表创建映射,将循环转换为Java流

郎正平
2023-03-14

转换列表时遇到错误

我可以做一个传统的代码,但我得到一个错误,而做使用Java8流,忽略重复的键。

等效代码:

Map<String, Field> uniqueFields = new HashMap<>();
for (Field field : allFields) {
    uniqueFields.put(field.getName(), field);
}

在流下尝试,但存在语法错误:

java prettyprint-override">Map<String, Field> uniqueFields1 = allFields.stream()
    .collect(Collectors.toMap(
        Field::getName, 
        (oldValue, newValue) -> oldValue));

共有2个答案

柴彬
2023-03-14

收藏家的味道。应该为需要两个参数的toMap()提供函数:keyMapper和valueMapper(分别负责从流元素中删除键和值)。

但是在您的代码片段中,第二个参数的类型不是Function,因为您提供了两个参数oldValue和newValue,但Function只接受一个。

除了keyMapper和valueMapper函数需要第三个参数BinaryOperator,您需要使用一个版本的toMap,该参数用于解析映射到同一个键的值:

Map<String, Field> uniqueFields = allFields.stream()
    .collect(Collectors.toMap(
        Field::getName,      // generating a kay
        Function.identity(), // generating a value
        (oldValue, newValue) -> oldValue))); // resolving duplicates
窦华晖
2023-03-14

您只需要为toMap函数添加一个参数,告诉收集器Map的值应该是什么。您可以使用函数。identity(),这意味着它将直接通过字段。

 Map<String,Field> uniqueFields = allFields.stream()
    .collect(Collectors.toMap(Field::getName, Function.identity(), 
        (oldValue,newValue) -> oldValue));

 类似资料:
  • 我有一张这样的地图<代码>地图 我使用了对象映射器,但它不工作,因为映射在我的结构中包含另一个映射。

  • 我是Mapstruct的新手。我试图将列表转换为地图,我在网上搜索了很多,我有一些解决方案,比如它还没有在mapstruct中实现。如果有人能提供一些替代解决方案,我将很高兴。所有我希望转换映射如下: 现在是否可以使用MapStruct来实现?

  • 假设我有一个名为student的对象列表。对象Student的定义如下 在学生列表中,可以有多个具有相同studentName但不同CourseTaking的学生对象。现在我想把学生名单变成一张studentName和courseTaking的地图,如下所示 关键是studentName,而值是将同一学生的所有课程设置放在一起作为一个集合。我如何使用stream()&collection()来实现

  • 我正在尝试使用stream将列表转换为哈希映射。这是我的代码。。 现在我想添加一个条件,若我得到属性名为null,那个么应该将项添加到带有空字符串的映射中,如下所示(任意_attributeName,“”)。 如何使用流操作实现这一点。我知道我可以使用过滤条件检查属性名是否为null,但如果为null,我可以添加空白字符串吗。有可能吗?如果没有,为什么?请帮忙。

  • 我有下面的pojo 此employee类用于从mybatis orm获取对象列表(list)。 mybatis将输出作为列表返回,因为mybatis不支持将Map作为返回类型 我必须把它转换成地图 我尝试了下面的方法,但没有成功,因为它需要getName()和getId()方法 请告知是否有一种方法可以在不修改员工pojo的情况下使用stream实现。 注意:我知道我们可以使用ofr或for ea

  • 我有一个包含子对象列表的类,如下所示: 我有一个学生类列表,如下所示: 我可以使用传统的foreach循环对数据进行分组,但我想为此使用stream API,但不能这样做。你能帮忙吗?