Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразование кода в Stream / 13 сообщений из 13, страница 1 из 1
23.12.2017, 18:49
    #39574853
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Всем привет!

Есть код:
Код: java
1.
2.
3.
4.
5.
6.
String[] arguments = {"-a", "aaaa", "-b", "bbbb", "-c", "cccc", "-d", "dddd"};
Map<String, String> argsMap = new LinkedHashMap<>(arguments.length / 2);
        
for (int i = 0; i < arguments.length; i += 2) {
        argsMap.put(arguments[i], arguments[i + 1]);
}


Каким образом можно преобразовать этот код в Stream?
...
Рейтинг: 0 / 0
23.12.2017, 19:26
    #39574858
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Массив строк можно преобразовать в стрим
Код: java
1.
Arrays.stream(arguments)


но не факт что дальше будет удобно работать.
Возможно императивная реализация которая приведена
выше будет вполне себе хороша.
...
Рейтинг: 0 / 0
23.12.2017, 19:49
    #39574862
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
mayton, вы не поняли меня...
Как с помощью Stream можно разбить массив arguments на пары, поместив их в Map?:
-a:aaaa
-b:bbbb
-c:cccc
-d:dddd
...
Рейтинг: 0 / 0
23.12.2017, 19:49
    #39574863
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
типа, просто
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
import java.util.Arrays;
import java.util.Map;
import java.util.LinkedHashMap;

public class Solver {
  public static void main(String[] args) {
    Map<String, String> argsMap = new LinkedHashMap<>((args.length+1) / 2);
    Arrays.stream(args).reduce(argsMap::put);
    System.out.println(argsMap);
  }
}

... но есть ньюанс - операция в аргументе reduce() должна быть ассоциативной, а Map.put() существенно зависит от перестановки аргументов:
Код: plaintext
1.
2.
3.
4.
java Solver -a aa
Exception in thread "main" java.lang.NullPointerException
..
java Solver -a a -b bb
{-a=a, null=bb}
...
Рейтинг: 0 / 0
23.12.2017, 19:57
    #39574864
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Basil A. Sidorovтипа, простоФигню написал - требуется "класс::статический-метод". У map-компашки я таких не вижу, а городить сложные цепочки - у меня ломается мозг.
...
Рейтинг: 0 / 0
23.12.2017, 20:39
    #39574867
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Basil A. Sidorov, stream извлекает по 1 элементу а в нашем случае надо работать с парами
соседних элементов исходного массива.
...
Рейтинг: 0 / 0
23.12.2017, 21:15
    #39574872
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
maytonBasil A. Sidorov, stream извлекает по 1 элементу Integer.sum(int, int)
суммируем поток
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
import java.util.Arrays;

public class Solver {
  public static void main(String[] args) {
    int[] items = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    System.out.println("Summ of decimal digits: " + Arrays.stream(items).reduce(0, Integer::sum));
  }
}

Код: plaintext
1.
java Solver
Summ of decimal digits: 45
...
Рейтинг: 0 / 0
23.12.2017, 21:44
    #39574874
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Molasar,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Map<String, String> map = 
    Arrays
        .stream(arguments)
        .collect(Collectors.collectingAndThen(
            Collectors.groupingBy(t -> t.startsWith("-")), 
            t -> {
                List<String> k = t.get(true);
                List<String> v = t.get(false);
                
                return 
                    IntStream
                        .range(0, k.size())
                        .boxed()
                        .collect(Collectors.toMap(k::get, v::get));
            }
        ));

System.out.println(map);
...
Рейтинг: 0 / 0
23.12.2017, 23:57
    #39574891
andreykaT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Molasarmayton, вы не поняли меня...
Как с помощью Stream можно разбить массив arguments на пары, поместив их в Map?:
-a:aaaa
-b:bbbb
-c:cccc
-d:dddd

ты там тестовое задание чтоль решаешь? то тебе набор строк в массив слов разбить, то теперь массив в стрим перевести? может рановато еще - не?
...
Рейтинг: 0 / 0
24.12.2017, 00:12
    #39574893
andmed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Код: java
1.
2.
3.
IntStream.range(0, arguments.length)
                .filter(e -> e % 2 == 0)
                .forEach(e -> argsMap.put(arguments[e], arguments[e + 1]));


изи
...
Рейтинг: 0 / 0
24.12.2017, 10:19
    #39574923
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
andmed,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Map<String, String> map2 = 
    Stream
        .iterate(0, i -> i + 1)
        .limit(arguments.length)
        .filter(i -> i % 2 == 0)
        .collect(Collectors.toMap(
            k -> arguments[k], 
            v -> arguments[v + 1]
        ));

System.out.println(map2);
...
Рейтинг: 0 / 0
24.12.2017, 10:28
    #39574924
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
andmed
Код: java
1.
2.
3.
IntStream.range(0, arguments.length)
                .filter(e -> e % 2 == 0)
                .forEach(e -> argsMap.put(arguments[e], arguments[e + 1]));


изи
Если вспомнить что стримы часто используются при обработке т.н. больших данных (BigData),
то данный код, который использует индексируемый доступ для больших данных в общем
случае - непригоден. Он ничем не лучше самого первого варианта. Просто синтаксический
сахар над ним.

Я-бы при разработке данной задачи исходил из того что у нас нет массива а у нас Iterator
или Iterable (в крайнем случае есть поддержка split для разделения наших больших
данных на бранчи или бакеты для обоаботки).

Вот как-то так. В другой постановке эта задача просто неинтересна.
...
Рейтинг: 0 / 0
24.12.2017, 19:50
    #39575039
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Преобразование кода в Stream
Всем большое спасибо за предложенные решения.

Тестировал с массивом из 2 000 000 строк: последний вариант от Usman работает быстрее предложенного andmed.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Преобразование кода в Stream / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]