Сравнение двух списков с использованием Java8 Matching Methods - PullRequest
0 голосов
/ 28 октября 2018

Используя методы сопоставления Java8, я могу сравнить два списка и получить логические результаты, если в обоих списках есть совпадение.

Пожалуйста, найдите мой код ниже.

public class StreamTest2 {

    public static void main(String args[]) {

        List<Integer> aList = Arrays.asList( new Integer[] {
                1,3,5,6,8
        });

        List<Integer> bList = Arrays.asList( new Integer[] {
                10, 89, 8, 9
        });

        //If any number in List1 present in List2
        System.out.println("If any number present in aList is present in bList : "+aList.stream().anyMatch(num -> bList.contains(num)));

    }

}

Вывод:

If any number present in aList is present in bList : true

Но я хочу напечатать соответствующий номер из списка, как я могу напечатать соответствующий номер?

Ответы [ 3 ]

0 голосов
/ 28 октября 2018

Попробуйте это

aList.stream().filter(bList::contains).collect(Collectors.toSet());
0 голосов
/ 28 октября 2018

Причина, по которой вы получаете java.lang.UnsupportedOperationException при вызове retainAll, заключается в том, что Arrays#asList возвращает ArrayList, подкрепленный массивом фиксированного размера.Любая попытка удалить или добавить элемент в эти списки приведет к вышеупомянутому UnsupportedOperationException.

Решение, как предложил @LuCio, заключается в том, чтобы обернуть деталь Arrays.asList вызовом конструктора ArraysList следующим образом:

List<Integer> aList = new ArrayList(Arrays.asList(1,3,5,6,8));
List<Integer> bList = new ArrayList(Arrays.asList(10, 89, 8, 9));

, который вы должны вызывать:

aList.retainAll(bList);

Имейте в виду, что это изменит исходный список aList.Если вам нужно сохранить состояние aList, я бы предложил сделать копию aList перед вызовом retainAll.В этом случае может быть более подходящим один из предложенных потоковых API.

0 голосов
/ 28 октября 2018

Вы можете использовать filter и findFirst:

System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).findFirst().orElse(null));

. При этом будет напечатано соответствующее число, если оно найдено (оно остановится при первом совпадении), или null, если совпадение не найдено.найдено.

Или вы можете собрать все совпадения в List:

System.out.println("If any number present in aList is present in bList : "+aList.stream().filter(num -> bList.contains(num)).collect(Collectors.toList());
...