Совпадение строк в двух списках в Java 8 - PullRequest
0 голосов
/ 14 марта 2019

Вопрос прост и может быть решен тысячами способов.Но так как я изучаю Java 8, я хотел бы сделать это способом Java 8.

У меня есть два списка строк, например:

List<String> list1 = Arrays.asList("A", "B", "C", "D");
List<String> list2 = Arrays.asList("A", "D", "E");

Я хочу взять первыйэлемент из list1 и проверьте, присутствует ли строка в list2, и выведите Map<Boolean, String>.Примерно так:

Map<Boolean, String> resultMap = list1.stream().collect(partial -> Collectors.partitioningBy(list2.stream().filter(existing -> matchString(partial, existing))));

private static boolean matchString(String partial, String existing) {
    return partial.equals(existing);
}

Приведенный выше код имеет ошибку компиляции в matchString(partial, existing):

Неверный 1-й тип аргумента.Найдено: '', обязательно: 'java.lang.String'

Несколько вещей, на которые стоит обратить внимание, это то, что в моем реальном сценарии это не простой список строк, а более сложный объект и этот объектне переопределяет equals или hashcode метод.

Я очень хорошо знаю, что это можно сделать разными способами.Но может кто-нибудь, пожалуйста, дайте мне знать, как мы используем Collectors.partitioningBy в этом конкретном сценарии.

Ответы [ 2 ]

3 голосов
/ 14 марта 2019

С Collectors.partitioningBy вы можете получить Map<Boolean, List<String>>.From partitioningBy doc:

Возвращает Collector, который разбивает входные элементы в соответствии с Predicate и организует их в Map<Boolean, List<T>>.

В вашемcase:

Map<Boolean, List<String>> map = list1.stream()
            .collect(Collectors.partitioningBy(list2::contains));

В случае более сложного объекта, который не переопределяет equals / hashcode, вы можете выполнить сравнение по некоторому конкретному полю.Предполагая, что у вас есть что-то вроде:

class ComplexObj {
    private String id;
    ...
}

Map<Boolean, List<ComplexObj>> map = list1.stream()
            .collect(Collectors.partitioningBy(obj -> list2.stream()
                    .map(ComplexObj::getId)
                    .anyMatch(id -> id.equals(obj.getId()))));
1 голос
/ 15 марта 2019

Найдите мою реализацию ниже, используя Collectors.partitioningBy.Я использую метод List.contains () для предиката, и он отлично работает.Пожалуйста, попробуйте поделиться своими отзывами / предложениями.Спасибо.

package net.javapedia.streams;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class PartitioningByEx1 {

    public static void main(String[] args) {

        List<String> list1 = Arrays.asList("A", "B", "C", "D");
        List<String> list2 = Arrays.asList("A", "D", "E");

        list1.stream().collect(Collectors.partitioningBy(item -> list2.contains(item)))
                .forEach((key, val) -> System.out.println(key + "-->>" + val));
    }

}

Вывод программы:

Output

...