#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);
Комментариев нет:
Отправить комментарий