Java 8 установить поток цикла и сравнить с элементами массива - PullRequest
1 голос
/ 17 мая 2019

У меня есть набор, в котором есть список объектов типа TempDTO.

public class TempDTO {
   public String code;
   //getter
   //setter
}

Set<TempDTO> tempSet = service.getTempList();
tempSet has values whose code is ["01", "02", "04", "05"];
String[] lst = ["01", "02"]

Я хочу зациклить значение сравнения tempSet со значением в массиве lst, и мне нужен список значений, когда значение нематч.ожидаемый результат: ["04", "05"] я пробовал,

for(int i=0; i < lst.length; i++){
  String st = lst[i];
  tempSet.stream().forEach(obj -> {
  if((obj.getCode().equals(st) )){
    logger.debug(" equal " + obj.getCode());
  } else {
    logger.debug("not equal " + obj.getCode());
  }
  });    
}

Ответы [ 5 ]

2 голосов
/ 17 мая 2019

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

// convert array(lst) to arrayList
List<String> arrList = Arrays.asList(lst);

// now check if the values are present or not
List<String> nonDupList = tempSet.stream()
                                  .filter(i -> !arrList.contains(i.getCode()))
                                  .map(TempDTO::getCode)
                                  .collect(Collectors.toList());

который выводит:

[05, 04]

2 голосов
/ 17 мая 2019

При этом будут выведены все значения, которые не соответствуют:

Set<TempDTO> tempSet = new HashSet<>(Arrays.asList(
        new TempDTO("01"),
        new TempDTO("02"),
        new TempDTO("04"),
        new TempDTO("05")));
String[] arr = new String[] { "01", "02" };

List<String> list = Arrays.asList(arr);

List<String> output = tempSet
                        .stream()
                        .filter(temp -> !list.contains(temp.getCode()))
                        .map(temp -> temp.getCode())
                        .collect(Collectors.toList());

System.out.println(output);

Вывод:

[04, 05]

Если вы хотите получить объекты TempDTO, пропустите вызов .map(...)

1 голос
/ 17 мая 2019

Вы должны выполнить шаги.

  1. Получить весь список кодов, как этот:

    List<String> allCodesList = tempSet.stream()
      .map(value -> value.getCode())
      .collect(Collectors.toList())
    ;
    
  2. У вас уже естьвторой список.

  3. Чек boolean result = Arrays.equals(allCodesList.toArray(),lst.toArray());
0 голосов
/ 17 мая 2019

Я предлагаю использовать метод фильтра, сначала создайте вспомогательный список для использования, содержит метод, создайте функцию для получения необходимого значения (кода), затем предикат для фильтрации значений, не содержащихся в дополнительном списке, и, наконец, соберите значения в списке

// create an auxiliar list 
List<String> auxLst = Arrays.asList(lst);

// map to code
Function<TempDTO, String> map = t -> t.getCode();
// condition
Predicate<String> lstNotcontains = code -> !auxLst.contains(code);

List<String> missingValues = tempSet.stream().map(map).filter(lstNotcontains).collect(Collectors.toList());
0 голосов
/ 17 мая 2019

Это даст вам набор всех объектов TempDTO, у которых нет кодов в вашем списке

tempSet = tempSet.stream()
            .filter( obj -> !Arrays.stream( lst ).anyMatch( str -> str.equals( obj.getCode() ) ) )
            .collect( Collectors.toSet() );
...