Introducción
En la programación Java, ListIterator es una interfaz muy útil, que es una versión extendida del iterador de la interfaz List, que se puede utilizar para realizar el recorrido y la modificación de la estructura de datos de la lista enlazada.
fondo
ListIterator es una interfaz de clase interna proporcionada por Java, que encapsula el recorrido y la modificación de elementos en la Lista y proporciona una serie de métodos para respaldar estas operaciones. Proporciona más funciones que los iteradores ordinarios, como eliminar o reemplazar elementos durante la iteración e iterar hacia adelante. Debido a las características de ListIterator, esta interfaz es principalmente aplicable a la operación de la estructura de datos de la lista enlazada, como la clase LinkedList. Cuando necesitamos recorrer y modificar los elementos en la lista enlazada, necesitamos usar ListIterator.
uso
1. Travesía hacia adelante
- El objeto ListIterator se obtiene a través del método listIterator() de la Lista, y su posición inicial se establece al principio de la lista. También puede usar el método listIterator(int index) para especificar la posición del ListIterator para comenzar a recorrer la Lista:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
ListIterator<String> listIterator = list.listIterator();
while(listIterator.hasNext()){
String element = listIterator.next();
System.out.println(element);
}
2. Recorrido inverso
- Además del recorrido hacia adelante, ListIterator también proporciona un método para recorrer la Lista en sentido inverso. Utilice los métodos hasPrevious() y previous() para recorrer la Lista de atrás hacia adelante. El código de ejemplo es el siguiente:
while(listIterator.hasPrevious()){
String element = listIterator.previous();
System.out.println(element);
}
3. establecer, agregar, eliminar operaciones
- Además de recorrer la Lista, ListIterator también proporciona métodos para modificar los elementos de la Lista: remove(), set() y add()
while(listIterator.hasNext()){
String element = listIterator.next();
if("c".equals(element)){
listIterator.set("d");
}
if("b".equals(element)){
listIterator.add("e");
}
if("a".equals(element)){
listIterator.remove();
}
}
Práctica de desarrollo
- Retire algunas llaves innecesarias
if (Objects.nonNull(publishObject)) {
JSONObject pageJson = JSONObject.parseObject(publishObject);
JSONObject pageRetJson = pageJson.getJSONObject(RECEIPT_PUBLISH_INFO_PAGE_JSON);
List<TemplateFieldDTO> templateFieldDTOS = pageRetJson.getJSONArray("fields").toJavaList(TemplateFieldDTO.class);
boolean flag = menuId.equals(MYRECEIPTMENU);
ListIterator<TemplateFieldDTO> listIterator = templateFieldDTOS.listIterator();
while (listIterator.hasNext()) {
TemplateFieldDTO templateFieldDTO = listIterator.next();
if (templateFieldDTO.getFieldName().equals("purchaser")) {
listIterator.remove();
}
if (flag) {
if (templateFieldDTO.getFieldName().equals("remarksDescribe")) {
listIterator.remove();
}
if (templateFieldDTO.getFieldName().equals("remarksStatusName")) {
listIterator.remove();
}
}
}
pageRetJson.put("fields", templateFieldDTOS);
// 通过nacos获取配置的uri
String listUriStr = menusListUriJson.getString(menuId);
if (Func.isNotEmpty(listUriStr)) {
pageRetJson.put("uri", listUriStr);
}
menuJson.put(COMMON_PAGE_MENU_ID, pageRetJson);
}
La diferencia entre Iterator y ListIterator:
-
Iterator puede atravesar colecciones Set y List; ListIterator solo puede atravesar List.
-
Iterator solo se puede recorrer en una dirección; ListIterator se puede recorrer en ambas direcciones (adelante/atrás).
-
ListIterator hereda de la interfaz Iterator, agregando nuevas funciones, como agregar un elemento, reemplazar un elemento y obtener la posición de índice del elemento anterior o siguiente.
iterador
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
ListIterator
package java.util;
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}