Java поток создать объект и сравнить - PullRequest
0 голосов
/ 26 апреля 2018

Я довольно новичок в потоках Java. Я должен разделить строку, возвращаемую фильтром в потоке, создать новый объект со строками в разбиении и сравнить каждый объект с предопределенным объектом. Поток выглядит так (я знаю, что это неправильно, просто представление того, что я пытаюсь сделать):

xmlstream.stream()
         .filter(xml->xml.getName()) //returns a string
         .map(returnedString -> split("__"))
         .map(eachStringInList -> new TestObj(returnedStr[0], returnedStr[1]))
         .map(eachTestObj -> eachTestObj.compareTo(givenObj))
         .max(Comparing.compare(returnedObj :: aProperty))

Как мне этого добиться? В основном сопоставьте каждую строку в списке, чтобы создать объект, сравните его с объектом исправления и верните max, основываясь на одном из свойств. Благодарю.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете использовать reduce примерно так:

TestObj predefined = ...

TestObj max = 
       xmlstream.stream()
                .map(xml -> xml.getName()) //returns a string
                .map(s -> s.split("__"))
                .map(a -> new TestObj(a[0], a[1]))
                .reduce(predifined, (e, a) -> 
                      e.aProperty().compareTo(a.aProperty()) >= 0 ? e : a);

Более эффективная версия выше была бы:

TestObj predefined = ...
TestObj max =
        xmlstream.stream()
                 .map(xml -> xml.getName()) //returns a string
                 .map(s -> s.split("__"))
                 .map(a -> new TestObj(a[0], a[1]))
                 .filter(e -> e.aProperty().compareTo(predefined.aProperty()) > 0)
                 .findFirst()
                 .orElse(predefined);

Обновление:

Если вы хотите извлечь объект max по заданному свойству из всех объектов TestObj, меньших, чем предопределенный TestObj, то вы можете выполнить следующее:

TestObj predefined = ...
Optional<TestObj> max =
             xmlstream.stream()
                      .map(xml -> xml.getName()) 
                      .map(s -> s.split("_"))
                      .map(a -> new TestObj(a[0], a[1]))
                      .filter(e -> e.aProperty().compareTo(predefined.aProperty()) < 0)
                      .max(Comparator.comparing(TestObj::aProperty));

max возвращает Optional<T>; если вы не знакомы с ним, обратитесь к документации здесь , чтобы ознакомиться с различными способами развертывания объекта Optional<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...