Java Параллельный поток AnyMatch одного поля параллельного потока - PullRequest
0 голосов
/ 09 июля 2020

Я новичок в Java, но я хотел бы использовать Parallel Streams вместо For. Итак, у меня есть список ArrayList объекта pojo, как показано ниже, и попробуйте проверить поле одного объекта вторым объектом:

List<DataOne> dol = new ArrayList<>();
/// dol.add(new DataOne("fieldA", "fieldB", "fieldC")); ...

List<DataTwo> dtl = new ArrayList<>();
/// dol.add(new DataTwo("field1", "field2", "field3")); ...

boolean cc = dol.parallelStream()
    .filter(Objects::nonNull)
    .filter(a ->  a.getFieldA() != null && a.getFieldB() != null && a.getFieldC() != null)
    .anyMatch(a -> 
         dtl.parallelStream()
         .filter(Objects::notNull)
         .filter(b -> b.getField1 != null && b.getField2 != null && b.getField3 != null)
         .anyMatch(b -> b.getField1.contains(a.getFieldA)));

Но он не работает ... Что я сделал не так?

1 Ответ

0 голосов
/ 10 июля 2020

Вы используете метод contains () для поиска совпадающих полей. DataTwo.getField1 (). Contains (DataOne.getFieldA ()) ---> "field1" .contains ("fieldA") -> возвращает "false", поскольку "field1" не содержит "fieldA". Но если DataTwo.field1 был чем-то вроде «fieldAekstra», тогда DataTwo.getField1 (). Contains (DataOne.getFieldA ()) -> вернет true, потому что «fieldAekstra» содержит одно «fieldA».

Пример ниже работает правильно и выводит «Соответствие найдено». Я только что исправил несколько опечаток. В целом ваш код работает, просто в элементах вашего примера списка не было совпадающих строк.

List<DataOne> dol = new ArrayList<>();
     dol.add(new DataOne("fieldA", "fieldB", "fieldC")); 
     dol.add(new DataOne("fieldD", "fieldF", "fieldH"));
     dol.add(new DataOne("fieldK", "fieldM", "fieldN"));
    List<DataTwo> dtl = new ArrayList<>();
    dtl.add(new DataTwo("fieldAEkstra", "fieldBEkstra", "fieldCEkstra")); 
    dtl.add(new DataTwo("fieldDEkstra", "fieldFEkstra", "fieldHEkstra"));
    dtl.add(new DataTwo("fieldTEkstra", "fieldOEkstra", "fieldWEkstra"));
    /*dtl.add(new DataTwo("field1", "field2", "field3")); 
    dtl.add(new DataTwo("field4", "field5", "field6")); 
    dtl.add(new DataTwo("field7", "field8", "field9")); */
    boolean cc = dol.parallelStream()
            .filter(Objects::nonNull)
            .filter(a ->  a.getFieldA() != null && a.getFieldB() != null && a.getFieldC() != null)
            .anyMatch(a -> 
                 dtl.parallelStream()
                 .filter(Objects::nonNull)
                 .filter(b -> b.getField1() != null && b.getField2() != null && b.getField3() != null)
                 .anyMatch(b -> b.getField1().contains(a.getFieldA())));
    if(cc)
        System.out.println("Match found!");
    else
        System.out.println("No Match !");

Вывод:

Match found!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...