Оптимизировать метод, уменьшив количество кода / операций в списке - PullRequest
0 голосов
/ 02 июля 2019

Я хочу уменьшить накладные расходы, объединив свои операции в одну, но, похоже, не совсем понимаю, как завершить мой код без ошибок

В настоящее время у меня есть этот код, который работает:

public Map<String, Invoice> initialize(List<String> paths) {
    List<Invoice> invoices = paths
        .stream()
        .map(Invoice::new)
        .collect(Collectors.toList());

    invoices
        .forEach(e -> {
            e.setInvoiceInputStream(reader(e.getInvoicePath()));
            e.setInvoiceId(invoiceFinder.getInvoiceId(e.getInvoiceInputStream()));
        });

    Map<String, Invoice> invoiceMap = invoices
        .stream()
        .collect(
                Collectors.toMap(
                        e -> e.getInvoiceId(),
                        e -> e)
                );

return invoiceMap;

Однако выполнение этого кода 3 раза кажется пустой тратой времени. Если я пытаюсь что-то другое, как я получаю ошибки:

return invoicePaths
    .stream()
    .map(Invoice::new)
    .collect(
        Collectors.collectingAndThen(
            Collectors.toList(), list -> {
                list
                    .forEach(e -> {
                        e.setInvoiceInputStream(reader(e.getInvoicePath()));
                        e.setInvoiceId(invoiceFinder.getInvoiceId(e.getInvoiceInputStream()));
});

Конструктор в классе Invoice:

public Invoice(String invoicePath) {
    this.invoicePath = invoicePath;
}

Как я могу уменьшить затраты на оптимизацию своего кода?

Ответы [ 2 ]

2 голосов
/ 02 июля 2019
 paths
    .stream()
    .map(Invoice::new)
    .map(e -> {
           e.setInvoiceInputStream(reader(e.getInvoicePath()));
           e.setInvoiceId(invoiceFinder.getInvoiceId(e.getInvoiceInputStream()));
           return e;

    })
    .collect(Collectors.toMap(
                  Invoice::getInvoiceId,
                  Function.identity())
            );

Надеюсь, я не пропустил ни одной скобки ...

Подумайте об этом, вы собираете List<Invoice> invoices только forEach их и что-то меняете - не так ли Stream::map операция? И после этого вы collect переводите их в Map =>, просто продолжайте конвейер потока после этого.

0 голосов
/ 02 июля 2019

Не похоже, что вы делаете что-то полезное в среднем цикле - почему бы не добавить это, например, карта?

public Map<String, Invoice> initialize(List<String> paths) {
    return paths
        .stream()
        .map(path -> {
            Invoice e = new Invoice(path);
            e.setInvoiceInputStream(reader(e.getInvoicePath()));
            e.setInvoiceId(invoiceFinder.getInvoiceId(e.getInvoiceInputStream()));
            return e;
        })
        .collect(
                Collectors.toMap(
                        e -> e.getInvoiceId(),
                        e -> e)
                );
}```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...