Каков наилучший способ принудительно Streams.zip для перебора каждого элемента (с использованием Guava, Java)

#java #hashmap #java-stream #guava

#java #hashmap #java-stream #guava

Вопрос:

Я пытаюсь использовать Streams.zip чтобы создать карту. Меня не волнует результат, возвращаемый потоком, мне просто нужно, чтобы лямбда выполнялся для каждого элемента. Вот мой код

 String x[] = {"a", "b"};
String y[] = {"c", "d"};

var data = new HashMap<String, String>();

var myStream = Streams.zip(Arrays.stream(x), Arrays.stream(y),
                (arg1, arg2) -> { data.put(arg1, arg2); return 0; };
var result = myStream.collect(Collectors.toList()); // ideally don't want this line
  

Без строки collect() я не заполняю карту, так что самый простой способ сделать это, я попробовал count() вместо collect, но это полностью сокращает zip.
Или есть более простое однострочное решение без Streams.zip чтобы заполнить карту из двух списков?

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

1. Можете ли вы указать ожидаемый результат? Это более четко объяснило бы проблему

2. затем вы можете собрать toMap , но без операции терминала вы не сможете фактически выполнить put

Ответ №1:

Вместо этого вы должны использовать Streams#forEachPair :

 String x[] = {"a", "b"};
String y[] = {"c", "d"};

var data = new HashMap<String, String>();

Streams.forEachPair(Arrays.stream(x), Arrays.stream(y), data::put);

System.out.println(data); // {a=c, b=d}
  

Очевидно, что если вам не нужно управлять HashMap, вы можете просто собрать:

 String x[] = {"a", "b"};
String y[] = {"c", "d"};

var result = Streams.zip(Arrays.stream(x), Arrays.stream(y), Maps::immutableEntry)
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

System.out.println(result); // {a=c, b=d}
  

Ответ №2:

Еще один подход:

 String[] keys = {"k1", "k2"};
String[] values = {"v1", "v2"};
Map<String, String> result = IntStream.range(0, keys.length).boxed()
    .collect(Collectors.toMap(i -> keys[i], i -> values[i]));
  

Преимущество этого заключается в том, что он не имеет побочных эффектов и не требует создания записей карты вручную перед их объединением, все обрабатывается самим сборщиком.