Учитывая список элементов, я хочу получить элемент с данным свойством и удалить его из списка. Лучшее решение, которое я нашел:
ProducerDTO p = producersProcedureActive
.stream()
.filter(producer -> producer.getPod().equals(pod))
.findFirst()
.get();
producersProcedureActive.remove(p);
Действительно ли возможно объединиться, получают и удаляют в лямбда-выражении?
Ниже логики решение, не изменяя исходный список
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"]
Когда мы хотим к , получают несколько элементов из Списка в новый список (фильтр с помощью предиката) и удаляют их из существующего списка , я не мог найти надлежащий ответ нигде.
Вот то, как мы можем сделать это с помощью разделения Потокового 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 эта статья .
задача: получите вњ ¶ и , вњ ¶ удаляют элемент из списка
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
} ) );