Лямбда Java 8 получает и удаляет элемент из списка

Учитывая список элементов, я хочу получить элемент с данным свойством и удалить его из списка. Лучшее решение, которое я нашел:

ProducerDTO p = producersProcedureActive
                .stream()
                .filter(producer -> producer.getPod().equals(pod))
                .findFirst()
                .get();
producersProcedureActive.remove(p);

Действительно ли возможно объединиться, получают и удаляют в лямбда-выражении?

61
задан 1 March 2016 в 00:44

3 ответа

Ниже логики решение, не изменяя исходный список

List<String> str1 = new ArrayList<String>();
str1.add("A");
str1.add("B");
str1.add("C");
str1.add("D");

List<String> str2 = new ArrayList<String>();
str2.add("D");
str2.add("E");

List<String> str3 = str1.stream()
                        .filter(item -> !str2.contains(item))
                        .collect(Collectors.toList());

str1 // ["A", "B", "C", "D"]
str2 // ["D", "E"]
str3 // ["A", "B", "C"]
1
ответ дан 31 October 2019 в 15:03

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

Вот то, как мы можем сделать это с помощью разделения Потокового API Java.

Map<Boolean, List<ProducerDTO>> classifiedElements = producersProcedureActive
    .stream()
    .collect(Collectors.partitioningBy(producer -> producer.getPod().equals(pod)));

// get two new lists 
List<ProducerDTO> matching = classifiedElements.get(true);
List<ProducerDTO> nonMatching = classifiedElements.get(false);

// OR get non-matching elements to the existing list
producersProcedureActive = classifiedElements.get(false);

Этот способ, которым Вы эффективно удаляете фильтрованные элементы из исходного списка и добавляете их к новому списку.

Относятся 5.2. Раздел Collectors.partitioningBy эта статья .

0
ответ дан 31 October 2019 в 15:03

задача: получите вњ ¶ и , вњ ¶ удаляют элемент из списка

p.stream().collect( Collectors.collectingAndThen( Collector.of(
    ArrayDeque::new,
    (a, producer) -> {
      if( producer.getPod().equals( pod ) )
        a.addLast( producer );
    },
    (a1, a2) -> {
      return( a1 );
    },
    rslt -> rslt.pollFirst()
  ),
  (e) -> {
    if( e != null )
      p.remove( e );  // remove
    return( e );    // get
  } ) );
0
ответ дан 31 October 2019 в 15:03

Другие вопросы по тегам:

Похожие вопросы: