简体   繁体   English

Java:对嵌套列表的简单访问 <Object> 在实体上

[英]Java : Simple access for nested List<Object> on Entity

I have an Entity with multiple nested lists like this : 我有一个带有多个嵌套列表的实体,如下所示:

public class DataFile  {
    @Id
    private int id;
    private List<DataObject> datas = new ArrayList<>();
}

public class DataObject {
    @Id
    private String type;
    private List<DataValue> values = new ArrayList<>();
}


public class DataValue  {
    @Id
    private int id;
    private String dataValue;
    private LocalDateTime dataDate = LocalDateTime.now();
}

If I want a specific dataValue with DataObject.type = "speType" and DataValue.id = 2, I need this: 如果我想使用DataObject.type =“ speType”和DataValue.id = 2的特定dataValue,则需要这样做:

String value = dataFile.getDatas().forEach(t -> {
                 if(t.getType().equals("speType")){
                    t.getValues().forEach(v -> {
                        if(v.getId(2))
                            return v.getDataValue();
                    });
                  }
               });

Is it possible to create a simple method ? 是否可以创建一个简单的方法?

Thanks 谢谢

You could try something like that : 您可以尝试这样的事情:

Optional<String> optValue =
        dataFile.getDatas()
                .stream()
                .filter(t -> t.getType().equals("specType"))
                .flatMap(t -> t.getValues().stream()
                           .filter(v -> v.getId() == 2)
                           .map(DataValue::getDataValue)
                )
                .findFirst();

Stream.findFirst() allows to exit of the processing early as soon as one element of it matches to the conditions. Stream.findFirst()一个元素与条件匹配,就可以提前退出该处理。 Similarly to what you did in your actual code. 与您在实际代码中所做的类似。

Note that Stream.findFirst() returns an Optional . 请注意, Stream.findFirst()返回Optional Either unwrap the object after the terminal operation such as : 终端操作后,请打开对象的包装:

String value = optValue.orElse("default value");

Or do in this stream itself : 或者在此流本身中执行以下操作:

String value = 
     ...
     .findFirst();
     .orElse("defaultValue")

For a pure "stream" solution : 对于纯“流”解决方案:

dataFile.getDatas()
            .stream()
            .filter(t -> t.getType().equals("speType"))
            .flatMap(t -> t.getValues().stream())
            .filter(v -> v.getId()==2)
            .map(DataValue::getDataValue)
            .findFirst();

I assumed that by "if(v.getId(2))" you meant "if(v.getId()==2)", if not you can easily change the code above. 我假设“ if(v.getId(2))”表示“ if(v.getId()== 2)”,否则,您可以轻松更改上面的代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM