Как связать слова из двух списков в Java - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу создать предложение из слов из двух разных списков.Как и в примере выше:

"list1w1 list2w1 list1w2 list2w2 list1w3 list2w3 ..."

Я знаю, как это сделать для цикла for, но я хочу использовать потоки,Это вообще возможно?

Мое текущее решение:

StringBuilder result = new StringBuilder();
for(int i=0; i<doses.size(); i++)
result.append(String.format("%s %s<br>", list1.get(i), list2.get(i)));

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

Вы можете использовать zip для решения этой проблемы.

Использование потоков с коллекциями Eclipse Collectors2.zip():

List<String> one = Arrays.asList("list1w1", "list1w2", "list1w3");
List<String> two = Arrays.asList("list2w1", "list2w2", "list2w3");

String output = one.stream().collect(Collectors2.zip(two))
        .collect(pair -> pair.getOne() + ' ' + pair.getTwo())
        .makeString("<br>");

Использование API-интерфейсов коллекций Eclipse напрямую:

String output = LazyIterate.zip(one, two)
        .collect(pair -> pair.getOne() + ' ' + pair.getTwo())
        .makeString("<br>");

Примечание: я являюсь коммиттером для Eclipse Collections.

0 голосов
/ 11 декабря 2018

Вы можете сделать это так,

IntStream.range(0, list1.size())
    .mapToObj(i -> String.format("%s %s", list1.get(i), list2.get(i)))
    .collect(Collectors.joining("<br>"));

И вот еще один способ сделать это.

IntStream.range(0, list1.size()).boxed()
    .collect(Collectors.mapping(i -> list1.get(i) + " " + list2.get(i), 
        Collectors.joining("<br>")));
0 голосов
/ 11 декабря 2018

Я считаю, что вы ищете это flatMap.

Что-то вроде:

List<String> list1 = Arrays.asList("a", "b", "c");
List<String> list2 = Arrays.asList("1", "2", "3");

List<String> result = list1.stream()
        .flatMap(s1 -> list2.stream().map(s2 -> s1 + s2))
        .collect(Collectors.toList());

System.out.println(result);

Это напечатает [a1, a2, a3, b1, b2, b3, c1, c2, c3], что вы ищете

0 голосов
/ 11 декабря 2018

Используйте IntStream:

String res = IntStream.range(0, list1.size())
        .mapToObj(i -> String.format("%s %s", list1.get(i), list2.get(i)))
        .collect(Collectors.joining("<br>"));
...