Разделить поток - PullRequest
       10

Разделить поток

0 голосов
/ 27 марта 2019

У меня есть файл.Я получаю поток, используя Files.lines.Файл большой.Мне нужно пройти через это в цикле и сформировать несколько массивов.Во время прохождения файла каждый сгенерированный массив должен быть передан методу, который его обработает.Я знаю, что есть методы PartitioningBy и GroupingBy, но я не знаю, как применить их к моей задаче.Я пытаюсь сделать это:

@Test
public void myTest() {
    Stream<String> lines = Stream.of(
            "some row from my file 1",
            "some row from my file 2",
            "some row from my file 3",
            "some row from my file 4",
            "some row from my file 5",
            "some row from my file n",
            "some row from my file 750000"
    );
    lines.parallel()
            .unordered()
            .collect(Collectors.partitioningBy(s -> s == 3).supplier(it -> {
                myParser(it);
            }));
}

public void myParser(List<String> myList){
    //this piece of code should give the length of the transmitted array
    System.out.println(myList.size()); 
}

В методе myParser я хочу получить массивы из 3 элементов и обработать их

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Вы можете попробовать это, чтобы разделить ваш поток:

public class T30SplitStream {

public static void main(String[] args) {
    Stream<String> lines = Stream.of("some row from my file 1", "some row from my file 2",
            "some row from my file 3", "some row from my file 4", "some row from my file 5",
            "some row from my file n", "some row from my file 750000");
    AtomicInteger i = new AtomicInteger(0);
    Map<Integer, List<String>> map = lines.parallel().unordered().map(s -> new Pair(i.incrementAndGet(), s))
            .collect(Collectors.groupingBy(p -> p.i % 3, Collectors.mapping(p -> p.s, Collectors.toList())));
    System.out.println(map);

}

public static class Pair {
    public final Integer i;
    public final String s;

    public Pair(int i, String s) {
        this.i = i;
        this.s = s;
    }
}
}
0 голосов
/ 27 марта 2019

Я остановлюсь на этой опции

    ArrayList<String> list = new ArrayList<>();

    lines.forEach(it -> {
        list.add(it);
        if (list.size() > 0 && list.size() % 3 == 0) {
            myParser(list);
            list.clear();
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...