Java stream api

131
14 августа 2019, 01:40

есть такой метод

public List<DocType> mapDocType(List<ru.server.model.DocType> docTypes) {
     List<DocType> result = new ArrayList<DocType>();
     for(ru.server.model.DocType docType : docTypes) {
         DocType temp = new DocType();
         temp.setId(docType.getId());
         temp.setDocident(docType.getDocident());
         temp.setDocname(docType.getDocname());
         result.add(temp);
     }
     return result;
}

надо переписать его, используя stream api, как это сделать правильно?

Answer 1

Чтобы было красиво, нужно сделать либо конструктор в DocType, либо аналогичный static метод вида:

public DocType(ru.server.model.DocType docType){
    this.id = docType.getId();
    this.docident = docType.getDocident();
    this.docname = docType.getDocname();
}

либо

public static DocType of(ru.server.model.DocType docType){ //of/from/by, как хотите называйте
    DocType temp = new DocType();
    temp.setId(docType.getId());
    temp.setDocident(docType.getDocident());
    temp.setDocname(docType.getDocname());
    return temp;
}

и после этого ваш метод преобразится в:

public List<DocType> mapDocType(List<ru.server.model.DocType> docTypes) {
    return docTypes.stream()
        .map(DocType::new)
        .collect(Collectors.toList());
}

или, соответственно

public List<DocType> mapDocType(List<ru.server.model.DocType> docTypes) {
    return docTypes.stream()
        .map(DocType::of)
        .collect(Collectors.toList());
}
Answer 2

Не знаю, какой тут смысл функционалки, но выглядит это примерно так:

public List<DocType> mapDocType(List<DocType> docTypes) {
    return docTypes.stream().map((t) -> {
        final DocType temp = new DocType();
        temp.setId(docType.getId());
        temp.setDocident(docType.getDocident());
        temp.setDocname(docType.getDocname());
        return temp;
    }).collect(Collectors.toList());
}

Но лучше добавьте конструктор в класс DocType и передавайте в него id, docident, docname. Тогда все будет проще:

public List<DocType> mapDocType(List<DocType> docTypes) {        
    return docTypes.stream()
    .map(t -> new DocType(docType.getId(), docType.getDocident(), docType.getDocname()))
    .collect(Collectors.toList());
}
READ ALSO
Как избежать того, чтобы формат даты изменялся и дописывалось смещение +03:00?

Как избежать того, чтобы формат даты изменялся и дописывалось смещение +03:00?

Есть рест - сервис, принимающий xml и обрабатывающий его библиотекой jaxbДля одного из полей написан адаптер для даты:

99
При попытке получить данные из БД падает NPE

При попытке получить данные из БД падает NPE

Создал метод dbstore, который должен создавать базу, если она пуста, извелкать всех пользователей и тд

148
Мгновенная запись DataInputStream в socket

Мгновенная запись DataInputStream в socket

Всех приветствуюЯ пытаюсь сделать что-то вроде real-time video streaming'a

127
Как поместить в массив 10 000 000 000 чисел?

Как поместить в массив 10 000 000 000 чисел?

Мне нужно сделать массив в который я должна поместить 10 000 000 000 мелких чиселЯ дошла к тому что это не возможно

133