Java 8流 - 如何在分组结果中操作值?

7

我有一个对象列表,其中包含两个String字段,例如

Name1, Active
Name2, InActive
Name3, InActive
Name4, Active

And I would like to have a

Map<Boolean, List<String>>

当 Active 为 true,且 InActive 为 false 时。

我尝试过

active = dualFields.stream().collect(
       Collectors.groupingBy( 
           x -> StringUtils.equals(x.getPropertyValue(), "Active")));

但是我收到了

Map<Boolean, List<DualField>>
2个回答

9
首先,你可以使用partitioningBy,它是groupingBy的特殊情况(其中你按照Predicate分组为两组)。你可以使用mapping将对象映射到所需的字符串。
我假设你希望List<String>包含第二个属性的值(即不包含getPropertyValue(),该方法返回"Active"或"InActive")。
Map<Boolean,List<String>> map =
    dualFields.stream()
              .collect(Collectors.partitioningBy(x -> StringUtils.equals(x.getPropertyValue(), "Active"),
                                                 Collectors.mapping(DualField::getSecondPropertyValue,
                                                                    Collectors.toList()));

通过将StringUtils.equals(x.getPropertyValue(),“Active”)替换为x.getPropertyValue().equals(“Active”)或者(如果需要处理null)“Active”.equals(x.getPropertyValue()),代码变得更易读...还有标准API方法Objects.equals,它处理了null值,因此在任何情况下都没有必要使用第三方库提供的冗余方法,例如StringUtils.equals - Holger

4

如果你想让你的List<String>propertyValue组成,则:

active = dualFields.stream().collect(
        Collectors.groupingBy( 
            x -> StringUtils.equals(x.getPropertyValue(), "Active"),
            Collectors.mapping(DualField::getPropertyValue, Collectors.toList());
            ));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接