Необходимо переделать не большую часть кода не используя циклы (for, while)

Имеется код, цель которого собрать всю информацию из csv файла (в котором находится информация о товарах), после чего код должен создать Entry класс для каждого отдельного продукта.

Необходимо переделать код без цикла for.

public class Repository {

    private static final String FILE_PATH = "src/fp/sales/sales-data.csv";
    private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
    public ArrayList<Entry> data = new ArrayList<>();

    public Repository() {
        try {
            List<String> list = Files.readAllLines(Paths.get(FILE_PATH));
            String cvsSplitBy = "\t";

            for (int i = 1; i < list.size(); i++) {
                String[] products = list.get(i).split(cvsSplitBy);
                Entry product = new Entry();
                product.setDate(LocalDate.parse(products[0], formatter));
                product.setState(products[1]);
                product.setProductId(products[2]);
                product.setCategory(products[3]);
                product.setAmount(Double.parseDouble(products[5].replace(",", ".")));
                data.add(product);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Ответы (1 шт):

Автор решения: Zhenyria

Рекурсия

Если вы хотите сделать цикл без цикла, то у вас всегда только один вариант - рекурсия.

Если вы не знаете, что это такое, то объясню: это когда функция (метод) вызывает сама себя и сама себе передаёт параметры.

Вам надо создать вот примерно такой метод:

private SomeData cycle(int cyclesCount, SomeData some) {
    if (cyclesCount == 0) {
        return some;
    } else {
        // какая-то логика
    }
    cycle(--cyclesCount, some);
}

и вызвать этот метод вместо цикла. Вот и всё. Учитывайте только, что рекурсию априори лучше заменить на цикл. Ошибки в рекурсии могут зациклить программу. Ну и про StackOverFlow не забываем.

Java 8

Если у вас есть требование, чтобы отсутствовал именно классический синтаксис цикла, то можно использовать метод forEach() (на самом деле он не относится к Stream API, хотя многие путают). Вот так это будет:

list.forEach(productsEntry -> {
    String[] products = productsEntry.split(cvsSplitBy);
    Entry product = new Entry();
    product.setDate(LocalDate.parse(products[0], formatter));
    product.setState(products[1]);
    product.setProductId(products[2]);
    product.setCategory(products[3]);
    product.setAmount(Double.parseDouble(products[5].replace(",", ".")));
    data.add(product);
})
→ Ссылка