Приведу небольшой и интересный, на мой взгляд, пример, как изменилась жизнь простого крестьянина Java разработчика, на примере задачи чтения и печати строк из файла.



Многие из нас помнят

'до Java 7' мучения:


        BufferedReader reader = null;
        try {
            reader = new BufferedReader(
                        new InputStreamReader(
                            new FileInputStream(FILE_NAME), Charset.forName("UTF-8")));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            // log error
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    // log warning
                }
            }
        }


которые могли облегчить, разве что

Apache Commons IO


        InputStreamReader in = null;
        try {
            in = new InputStreamReader(new FileInputStream(new File(FILE_NAME)), Charsets.UTF_8);
            LineIterator it = new LineIterator(in);
            while (it.hasNext()) {
                System.out.println(it.nextLine());
            }
        } catch (IOException e) {
            // log error
        } finally {
            IOUtils.closeQuietly(in);
        }


Или даже так:

        LineIterator it = null;
        try {
            it = FileUtils.lineIterator(new File(FILE_NAME), "UTF-8");
            while (it.hasNext()) {
                System.out.println(it.nextLine());
            }
        } catch (IOException e) {
            // log error
        } finally {
            if (it != null) {
                it.close();
            }
        }

Java 7


принесла automatic resource management (ARM), NIO.2 и StandardCharsets. Теперь без подключения сторонних библиотек появилась возможность сделать:

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                        new FileInputStream(FILE_NAME), StandardCharsets.UTF_8))){
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            // log error
        }


или еще короче:

            List<String> lines = Files.readAllLines(Paths.get(FILE_NAME), StandardCharsets.UTF_8);
            for(String line: lines){
                System.out.println(line);
            }


И, наконец:

Java 8


со своим Stream API и Лямбда-выражениями позволила сделать это в одну строчку:

            Files.lines(Paths.get(FILE_NAME), StandardCharsets.UTF_8).forEach(System.out::println);


Мораль: если у вас современная Java — надо делать хорошо, и не надо плохо.

Спасибо за внимание и успехов в кодировании!

Комментарии (13)


  1. SamVimes
    28.10.2015 10:22
    +8

    При переходе от 7 к 8 потерялась обработка exception'ов, что, конечно же, уменьшает количество кода:)


    1. eaa
      28.10.2015 10:48

      Просто автор сам себе этим слегка так противоречит «Мораль: если у вас современная Java — надо делать хорошо, и не надо плохо.»


    1. nikitasius
      28.10.2015 10:49
      +2

      В 9й версии будет как на картинке «sudo bring beer», и JDK сама напишет код с нуля. В 10й можно будет нарисовать мышкой схематику работы, а в 11й введут пластиковые «кубики от 3х лет» для джуниор и сеньор программистов и искоренят понятие говнокода, так весь код будет говно, и котлеты пропадут.


      1. eaa
        28.10.2015 10:56
        +1

        И вообще: «Я согласен, подготовка программистов — гиблое дело. И вообще, скоро программистов можно будет заменить компьютером, чтобы он писал код» (директор центра стратегических инноваций «Ростелекома» Борис Глазков).


        1. nikitasius
          28.10.2015 11:38

          Но ведь кто-то будет писать код для компьютера, который будет писать код // Inception

          Ждем появление сверх языка или буст asm?


  1. nomit
    28.10.2015 11:08
    +13

    Мораль: если у вас современная Java — надо делать хорошо, и не надо плохо.

    Нет, не та мораль. Нужна такая — Мораль: Цените свое время, читайте только интересные статьи, шлак фильтруйте.


  1. dim_s
    28.10.2015 11:20

    Я для чтения строк из файла использую класс Scanner с методами hasNextLine() + nextLine().


    1. EjikVTumane
      28.10.2015 15:14

      Который как раз при использовании regexp'а по-умолчанию (LINE_PATTERN) для 'hasNextLine()' и 'nextLine()' очень любит внезапно спотыкаться ;)


      1. dim_s
        28.10.2015 16:19

        Обычно я использую его только для чтения файла построчно и соответственно не использую regexp. Остальные методы чтения файла построчно у меня иногда выдавали некорректный результат на различных ОС, на одной работало, на другой нет.


        1. EjikVTumane
          28.10.2015 17:17

          Вот как раз при построчном чтении там и есть regexp'ы под капотом, для определения строки которую нужно вернуть при вызове 'nextLine()'.
          Поэтому Scanner все же стоит использовать аккуратно в отличие от прочих методов.


  1. baldr
    29.10.2015 23:53
    +1

    Содержит много сарказма, не читать java-программистам
    Обожемой! В Java наконец-то можно прочитать файл «без подключения сторонних библиотек»! И теперь с лямбдой и неким Stream API! И наконец-то в одну строку, а не в 25!
    Могуч язык, что сказать. Нам с нашими питонами-руби не угнаться…

    Ну не могу еще раз не вставить эту картинку, уж извините…
    image


    1. mirwide
      31.10.2015 16:16
      +1

      Фреймворки — они такие, особенно в кривых умелых руках.


  1. gkislin
    01.11.2015 22:09

    Есть такое. Но смотреть свысока на java будет близорукостью… Хотя бы потому что #1 по использованию и востребуемостии.

    > Нам с нашими питонами-руби не угнаться…
    Сарказм, да, читается. Вообще — область применения разная. Там где надо без этой портянки за одну строчку что то написать — конкурировать трудно, но, как видите, уже можно. Тот же Play вместо Django.
    А вот что то тяжелее- проект на 10^6 строк, где размер стека уже не так важен — увы для питон-руби…