Java: простой доступ для вложенного списка <Object>в Entity - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть сущность с несколькими вложенными списками, например:

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();
}

Если мне нужно конкретное значение dataVbue.type = "speType" и DataValue.id = 2, мне нужно это:

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

Можно ли создать простой метод?

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Для чистого «потокового» решения:

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

Я предположил, что под «if (v.getId (2))» вы подразумевали «if (v.getId () == 2)», если нет, вы можете легко изменить код выше.

0 голосов
/ 14 декабря 2018

Вы можете попробовать что-то вроде этого:

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() позволяет завершить обработку, как только один ее элемент соответствует условиям.Аналогично тому, что вы делали в своем действительном коде.

Обратите внимание, что Stream.findFirst() возвращает Optional.Либо разверните объект после операции терминала, например:

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

, либо сделайте в этом потоке саму:

String value = 
     ...
     .findFirst();
     .orElse("defaultValue")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...