Скажем, у меня есть 2 похожих списка (хотя и не одинаковых). Например: один список целых чисел и другой список шестнадцатеричных строк (который может быть сопоставлен с целым числом), как я могу найти, есть ли какой-либо общий элемент с одинаковым индексом в обоих списках с использованием потоков?
Рассмотрим следующий код:
List<Integer> l1 = List.of(11, 12, 13, 14, 15);
List<String> l2 = List.of("F", "E", "D", "C", "B")
boolean isCommon = checkIfCommonElementExists(l1, l2);
System.out.print("There's at least one common element at same index: " + isCommon);
В этом примере третий элемент обоих списков одинаков, т.е. 13
или OxD
Как я могу проверить (или найти), есть ли какой-либо такой общий элемент с тем же индексом и разорвать при первом совпадении (что-то вроде anyMatch()) с помощью Streams? Это простая проблема, которую можно решить без потоков, но можно ли ее решить с помощью потоков?
Если вы хотите отслеживать индексы, вероятно, проще и эффективнее использовать традиционные циклы for.
Это строгое требование делать это с потоками? Это было бы намного проще сделать с помощью простого цикла, поскольку цикл по своей конструкции знает об индексе списков, а поток (обязательно) не знает об этом.
Это не строгое требование. Я легко смог это сделать с помощью цикла, но когда я столкнулся с этой проблемой, мне просто было любопытно узнать, можно ли ее решить с помощью потоков. И, как предлагает приведенное ниже решение, это действительно возможно.
Вы можете сделать что-то вроде ниже, чтобы проверить, существуют ли какие-либо общие элементы
private static boolean checkIfCommonElementExists(List<Integer> list1, List<String> list2) {
return IntStream.range(0, Math.min(list1.size(), list2.size()))
.anyMatch(i -> list1.get(i).equals(Integer.parseInt(list2.get(i),16)));
}
или что-то вроде ниже, чтобы получить индексы общих элементов
private static int[] findCommonElementIndexes(List<Integer> list1, List<String> list2) {
return IntStream.range(0, Math.min(list1.size(), list2.size()))
.filter(i -> list1.get(i).equals(Integer.parseInt(list2.get(i),16)))
.toArray();
}
для данного примера:
List<Integer> l1 = List.of(11, 12, 13, 14, 15);
List<String> l2 = List.of("F", "E", "D", "C", "B");
boolean isCommon = checkIfCommonElementExists(l1, l2);
System.out.println("There's at least one common element at same index: " + isCommon);
System.out.println("Common indices" + Arrays.toString(findCommonElementIndexes(l1,l2)));
выход:
There's at least one common element at same index: true
Common indices: [2]
Это хороший пример того, что не следует делать с помощью Streams.