Переписать традиционный для l oop в streams.map java 8 - PullRequest
0 голосов
/ 05 февраля 2020

Я пытаюсь проверить запрос Rest API PUT. Это приложение с весенней загрузкой. PUT запрос используется для обновления в существующем списке объектов.

работает традиционный способ записи.

data - это данные в памяти - это List<Bean> и name (строковый тип) - это ключ для поиска объекта в данных, а objectBean - тот, который нужно заменить, когда мы найдем ключ (то есть name)

public void update(Bean objectBean, String name) {

    for(int i = 0; i < data.size() ; i++) {
        Bean l = data.get(i);
        if(l.getName().equals(name)) {
            data.set(i, objectBean);
            return;
        }
    }   

};

но я попытался написать, используя поток в java 8. ниже код

Data.stream().map(p -> p.getName().equals(name) ? objectBean: p );

, но это дает пустой список.

Ответы [ 3 ]

3 голосов
/ 05 февраля 2020

Использование streams здесь делает код только более сложным.

Если вы действительно хотите, вы можете ввести его, чтобы найти значение индекса i. После этого вы можете сделать замену.

IntStream.range(0, data.size())
    .filter(i -> data.get(i).getName().equals(name)).findFirst()
    .ifPresent(i -> data.set(i, objectBean));
0 голосов
/ 05 февраля 2020
return data.stream()
    .filter(bean -> bean.getName().equals(name))
    .findAny()
0 голосов
/ 05 февраля 2020

Учитывая, что data - это некоторый список с Bean объектами, вам нужно вернуть собранный вами поток:

return data.stream()
  .map(bean -> bean.getName().equals(name) ? objectBean : bean)
  .collect(Collectors.toList());

Если data - непустая итерируемая, тогда вывод должен быть так же, как map принимает Function объект. Тем не менее, это не очень хороший вариант использования для Stream API:

Во-первых, потоки предназначены для целей без побочных эффектов (т. Е. Для создания новых структур данных, а не их обновления). Потоковый API поддерживает forEach(Consumer<super T>), который разработан для побочных эффектов, но так же, как и многие другие коллекции, фактически все Iterables, тогда как неизменяемые операции, такие как map и flatMap, не являются.

Second Я не вижу остальную часть вашей программы, но, по крайней мере, в этом фрагменте вы, кажется, обновляете свою структуру данных на основе имени, и вы предполагаете, что имя уникально, потому что вы остановились, как только достигли первого Bean с именем, которое вы ищете. Попробуйте использовать Map<String, Bean> в качестве структуры данных.

Наконец, streams - это ленивые структуры данных, а это означает, что все цепочки операций вычисляются при сборе. Это дает стимул объединять множество вычислений вместе - объединение в цепочку только одного map не дает вам никаких преимуществ в производительности (хотя это дает вам ссылочную прозрачность).

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