【问题标题】:How to rewrite a method using Stream api? [closed]如何使用 Stream api 重写方法? [关闭]
【发布时间】:2020-08-23 09:00:16
【问题描述】:

如何使用 Stream api 重写方法?

private static List<Transaction> loadTransactionFromFile () throws ParseException, IOException {

    List<Transaction> transactions = new ArrayList<>();

    List<String> lines = Files.readAllLines(Paths.get(MOVEMENT_LIST.trim()));
    lines.remove(0);

    for (String line : lines) {
        String[] fragments = line.split(",");

        if (fragments.length != 8) {
            //  System.out.println("Wrong line:s " + line);
            continue;
        }

        transactions.add(new Transaction(
                fragments[ACCOUNT_TYPE],
                fragments[ACCOUNT_NUMBER],
                fragments[CURRENCY],
                (new SimpleDateFormat(dateFormat)).parse(fragments[DATE_OF_OPERATION]
                        .trim()),
                fragments[RRN],
                fragments[INFO].replaceAll("\\d|\\\\+|\\+|RUR|MCC|(Apple Pay-)" +
                        "|\\.|\\)|\\(|RUSMOSCOW ?|MOSCOW|RUS|J|\\/RU\\/", "")
                        .trim(),
                Double.parseDouble(fragments[INCOME]),
                Double.parseDouble(fragments[EXPENSE])
        ));
    }

    return transactions;
}

【问题讨论】:

  • 一种可能的解决方案:将foreach-loop 替换为lines.stream().map(line -&gt; line.split(",").filter(fragment -&gt; fragment.length == 8).forEach(transaction.add(new Transaction(...));

标签: java arraylist java-stream


【解决方案1】:

我没有测试过,但应该是这样的:

return lines.stream()
    .skip(1)
    .map(line -> line.split(","))
    .filter(l -> l.length==8)
    .map(fragments -> new Transaction(
            fragments[ACCOUNT_TYPE],
            fragments[ACCOUNT_NUMBER],
            fragments[CURRENCY],
            (new SimpleDateFormat(dateFormat))
                    .parse(fragments[DATE_OF_OPERATION]
                    .trim()),
            fragments[RRN],
            fragments[INFO].replaceAll("\\d|\\\\+|\\+|RUR|MCC|(Apple Pay-)" +
                    "|\\.|\\)|\\(|RUSMOSCOW ?|MOSCOW|RUS|J|\\/RU\\/", "")
                    .trim(),
            Double.parseDouble(fragments[INCOME]),
            Double.parseDouble(fragments[EXPENSE]))
    .collect(Collectors.toList());

【讨论】:

  • 不完全是。此解决方案不会跳过第一行 (lines.remove(0);)
  • @Turing85 你是对的,我忘记了..也许我可以使用 skip()
  • 嗯……不错。不知道这个操作=)
  • 整个过程可以进一步优化,首先将每一行映射到一个String[],然后过滤map(line -&gt; line.split(",").filter(...)...。因此,对.split(...) 的调用只需执行一次。
  • 更不用说顶部(将文件读入行,跳过第一行)也可以“流化”:Files.lines(path).skip(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2020-08-31
  • 2021-01-13
  • 1970-01-01
相关资源
最近更新 更多