首页 > 解决方案 > 在Java中,如何根据其任何属性过滤类实例列表以在流或一行中获取另一个

问题描述

如何使用流或任何其他方式在一行中写入而不是 for 循环来过滤它。

class Attribute {

  String name;
  String value;

  .. 
  //getter-setter

}

.. main
List<Attribute> list = populateAttributes();

for (Attribute attr : list) {

  if (attr.name == "some key") {
     return attr.value;
  }

}

我有兴趣在 1 行中这样做,因为我将从配置中读取该路径,并且我的通用代码将遍历点序列并使用反射调用方法。所以像这样classpackage.getAttributes...(getValue where attr.getname == "somekey")

标签: javajava-stream

解决方案


您可以使用 Stream.filter() 过滤具有属性名称与您的键匹配的属性的列表并找到第一个属性:

Optional<Attribute> attributeOptional = list.stream().filter(attr-> "some key".equals(attr.name).findFirst();

编辑:如果你想要属性的值,那么你可以使用 Optional.map() 将找到的属性映射到它的值,如果没有找到,那么一些默认值,比如 null。

String value = list
                    .stream()
                    .filter(attr-> key.equals(attr.name))
                    .findFirst()
                    .map(attribute -> attribute.value)
                    .orElse(null);

推荐阅读