Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Помогите перевести мою задачу на стримы JAVA8 JAVA9

#java #java_8 #java_stream


Учу сейчас стримы из Java 8 и JAVA 9. Проблема такая, как вначале пропустить строки
файла после позиции END OF HEADER(предпоследняя строка файла), а затем считать каждое
значение(оставшиеся цифры) и возможно ли мою задачу сделать на стримах?.

2.10           N: GPS NAV DATA                         RINEX VERSION / TYPE
teqc  2017Feb10     UNAVCO Archive Ops  20170418 19:33:16UTCPGM / RUN BY / DATE
    9.2160D+04 -1.1469D+05 -1.3107D+05  7.2090D+05          ION BETA
    9.313225746155D-10 3.552713678801D-15   233472     1930 DELTA-UTC: A0,A1,T,W
                                                            END OF HEADER
29 17  1  1  2  0  0.0 6.356909871101D-04-2.046363078989D-12 0.000000000000D+00


Начал делать так:

try {
       Files.lines(Paths.get("src/main/java/ab010010.17n"), StandardCharsets.UTF_8).//
дальше что применять и множества методов?;
    } catch (IOException e) {
       e.printStackTrace();
    }   

    


Ответы

Ответ 1



В Java9 появился метод потока dropWhile, серьёзно облегчающий вашу задачу: Files.lines(Paths.get("src/main/java/ab010010.17n"), StandardCharsets.UTF_8) .dropWhile(s -> !s.contains("END OF HEADER")) .skip(1) .map(s -> s.split(" ")) .flatMap(Arrays::stream) .filter(i -> !i.isEmpty()) .forEach(System.out::println);

Ответ 2



Как уже было сказано, можно решить задачу с использованием dropWhile из Java 9, но можно и написать собственный метод в Java 8, который выполнит аналогичные действия, например, следующим образом: Stream dropWhile(Stream source, Predicate predicate) { Spliterator sourceSpliterator = source.spliterator(); return StreamSupport.stream(new Spliterators.AbstractSpliterator( sourceSpliterator.estimateSize(), sourceSpliterator.characteristics() ) { boolean dropped; public boolean tryAdvance(Consumer action) { if (dropped) { return sourceSpliterator.tryAdvance(action); } while (!dropped) { if (!sourceSpliterator.tryAdvance(t -> dropped = predicate.test(t))) { return false; } } return true; } }, source.isParallel()); } И затем использовать данный метод в своём коде: Stream input = ... dropWhile(input, s -> s.contains("END OF HEADER")) .map(s -> s.split("\\s+")) .flatMap(Arrays::stream) .forEach(System.out::println);

Комментариев нет:

Отправить комментарий