betacode

Руководство Java List

  1. List
  2. Examples
  3. listInterator()
  4. stream()
  5. subList(int,int)
  6. spliterator()
  7. toArray(..)
  8. sort(Comparator)
  9. replaceAll(UnaryOperator)

1. List

List - это interface в Java коллекции интерфейсов и классов (Java Collection Framework). Поскольку это подинтерфейс Collection, он обладает всеми функциями Collection. Кроме того, он обеспечивает основу для поддержания упорядоченной Collection (ordered Collection). Он включает в себя методы, позволяющие вставлять, обновлять, удалять и искать элемент по индексу. List позволяет дублировать элементы и null элементы.
public interface List<E> extends Collection<E>
Иерархия классов реализует (implement) interface List:
LinkedList - это специальный класс, который принадлежит как группе List, так и группе Queue:
java.util.List
Listпредоставляет метод listlterator(), который возвращает объект Listlterator, позволяющий выполнять итерацию (iterate) элементов в прямом или обратном направлении. Классы, реализующие interface List - это ArrayList, LinkedList, Stack и Vector. Среди них более широко используются ArrayList и LinkedList.
Методы, определенные в List:
List interface
public interface List<E> extends Collection<E> {
  boolean isEmpty();
  boolean contains(Object o);

  Object[] toArray();
  <T> T[] toArray(T[] a);

  boolean containsAll(Collection<?> c);
  boolean addAll(Collection<? extends E> c);
  boolean addAll(int index, Collection<? extends E> c);
  boolean removeAll(Collection<?> c);
  boolean retainAll(Collection<?> c);

  int size();
  boolean equals(Object o);
  int hashCode();

  E get(int index);  
  E set(int index, E element);  
  boolean add(E e);
  void add(int index, E element);
  E remove(int index);
  boolean remove(Object o);
  void clear();

  int indexOf(Object o);
  int lastIndexOf(Object o);

  Iterator<E> iterator();
  ListIterator<E> listIterator();  
  ListIterator<E> listIterator(int index);

  List<E> subList(int fromIndex, int toIndex);

  default Spliterator<E> spliterator()  
  default void replaceAll(UnaryOperator<E> operator)
  default void sort(Comparator<? super E> c)  

  static <E> List<E> of()  
  static <E> List<E> of(E e1)  
  static <E> List<E> of(E e1, E e2)  
  static <E> List<E> of(E e1, E e2, E e3)  
  static <E> List<E> of(E e1, E e2, E e3, E e4)  
  static <E> List<E> of(E e1, E e2, E e3, E e4, E e5)  
  static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6)  
  static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7)  
  static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8)  
  static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9)  
  static <E> List<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10)  

  static <E> List<E> of(E... elements)  
  static <E> List<E> copyOf(Collection<? extends E> coll)  
}

2. Examples

List - это interface, поэтому для создания объекта List вам нужно создать его с помощью класса, который его реализует, например ArrayList, LinkedList,..
ListEx1.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;

public class ListEx1 {

    public static void main(String[] args) {
        // Create a List
        List<String> list = new ArrayList<String>();
        
        list.add("One");
        list.add("Three");
        list.add("Four");
        
        // Insert an element at index 1
        list.add(1, "Two");
        
        for(String s: list)  {
            System.out.println(s);
        }
        System.out.println(" ----- ");
        // Remove an element at index 2
        list.remove(2);
        
        for(String s: list)  {
            System.out.println(s);
        }
    }
}
Output:
One
Two
Three
Four
 -----
One
Two
Four
Book.java
package org.o7planning.list.ex;

public class Book {
    private String title;
    private float price;
    
    public Book(String title, float price)  {
        this.title = title;
        this.price = price;
    }
    public String getTitle() {
        return title;
    }

    public float getPrice() {
        return price;
    }  
}
Например: Объект List содержит типы данных Book.
ListEx2.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;

public class ListEx2 {

    public static void main(String[] args) {
        Book b1 = new Book("Python Tutorial", 100f);
        Book b2 = new Book("HTML Tutorial", 120f);
        
        // Create an Unmodifiable List
        List<Book> bookList1 = List.of(b1, b2);
        
        // Create a List of Books using ArrayList
        List<Book> bookList = new ArrayList<Book>();
        
        bookList.add(new Book("Java Tutorial", 300f));
        bookList.add(new Book("C# Tutorial", 200f));
        
        // Append all elements to the end of list.
        bookList.addAll(bookList1);
        
        for(Book book: bookList)  {
            System.out.println(book.getTitle() + " / " + book.getPrice());
        }
    }
}
Output:
Java Tutorial / 300.0
C# Tutorial / 200.0
Python Tutorial / 100.0
HTML Tutorial / 120.0
Array -> List
Статический метод Arrays.asList(..) позволяет преобразовать массив в объект List, однако этот объект имеет фиксированный размер, не можем добавлять или удалять существующие элементы, поскольку он не поддерживает дополнительные методы: add, remove, set и clear.
ListEx3.java
package org.o7planning.list.ex;

import java.util.Arrays;
import java.util.List;

public class ListEx3 {

    public static void main(String[] args) {
        Book b1 = new Book("Python Tutorial", 100f);
        Book b2 = new Book("HTML Tutorial", 120f);
        Book b3 = new Book("Java Tutorial", 300f);
        
        Book[] bookArray = new Book[] {b1, b2, b3};
        
        // Create a Fixed-size List.
        List<Book> bookList = Arrays.asList(bookArray);
        
        for(Book b: bookList)  {
            System.out.println("Book: " + b.getTitle());
        }
    }
}
Output:
Book: Python Tutorial
Book: HTML Tutorial
Book: Java Tutorial

3. listInterator()

Метод listlterator() возвращает объект Listlterator, который позволяет выполнять итерацию (iterate) элементов в прямом или обратном направлении.
ListIterator<E> listIterator();  

ListIterator<E> listIterator(int index);
Например:
List_listIterator.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class List_listIterator {

    public static void main(String[] args) {
        // Create a List
        List<String> list = new ArrayList<String>();
        list.add("One");
        list.add("Two");
        list.add("Three");
        list.add("Four");
        
        // Get a ListIterator.
        ListIterator<String> listIterator = list.listIterator();
        
        String first = listIterator.next();
        System.out.println("First:" + first);// -->"One"
       
        String second = listIterator.next();
        System.out.println("Second:" + second);// -->"Two"
       
        if (listIterator.hasPrevious()) {
            System.out.println("Jump back...");
            String value = listIterator.previous();
            System.out.println("Value:" + value);// -->"Two"
        }
 
        System.out.println(" ----- ");
 
        while (listIterator.hasNext()) {
            String value = listIterator.next();
            System.out.println("Value:" + value);
        }
    }
}
Output:
First:One
Second:Two
Jump back...
Value:Two
 -----
Value:Two
Value:Three
Value:Four

4. stream()

List - это подинтерфейс Collection, поэтому он наследует метод stream(). Доступ к элементам Collection через Stream делает ваш code кратким и легким для понимания:
List_stream.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;

public class List_stream {

    public static void main(String[] args) {
        Book b1 = new Book("Python Tutorial", 100f);
        Book b2 = new Book("HTML Tutorial", 120f);
        
        // Create an Unmodifiable List
        List<Book> bookList1 = List.of(b1, b2);
        
        // Create a List of Books using ArrayList
        List<Book> bookList = new ArrayList<Book>();
        
        bookList.add(new Book("Java Tutorial", 300f));
        bookList.add(new Book("C# Tutorial", 200f));
        
        // Append all elements to the end of list.
        bookList.addAll(bookList1);
        
        // Using Stream
        bookList.stream() //
             .filter(b -> b.getPrice() > 100) // Filter Books with price > 100
             .forEach(b -> System.out.println(b.getTitle() +" / " + b.getPrice()));
    }
}
Output:
Java Tutorial / 300.0
C# Tutorial / 200.0
HTML Tutorial / 120.0

5. subList(int,int)

Метод subList(int,int) возвращает частичное представление текущего объекта List, включая элементы из индекса fromIndex до tolndex.
Объект "subList" и текущий объект List связаны между собой, например, если вы удалите элемент в "subList", этот элемент также будет удален из текущего объекта List.
List<E> subList(int fromIndex, int toIndex);
List_subList.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;

public class List_subList {

    public static void main(String[] args) {
        // Create a List
        List<String> originList = new ArrayList<String>();
        
        originList.add("A"); // 0
        originList.add("B"); // 1
        originList.add("C"); // 2
        originList.add("D"); // 3
        originList.add("E"); // 4
        
        List<String> subList = originList.subList(1, 3); // fromIndex .. toIndex
        
        System.out.println("Elements in subList: ");
        for(String s: subList)  {
            System.out.println(s); // B C
        }
        
        subList.clear(); // Remove all elements from subList.
        System.out.println("Elements in original List after removing all elements from subList: ");
        
        for(String s: originList)  {
            System.out.println(s); // B C
        }
    }
}
Output:
Elements in subList:
B
C
Elements in original List after removing all elements from subList:
A
D
E

6. spliterator()

Создаем объект Spliterator для обхода и секционирования (traversing and partitioning) элементов List.
default Spliterator<E> spliterator()  // Java 8
Spliterator широко используется для обхода и секционирования (traversing and partitioning) множества различных источников данных, таких как Collection (List, Set, Queue), BaseStream, array.
  • Руководство Java Spliterator

7. toArray(..)

Метод toArray(..) возвращает массив, содержащий все элементы List.
Object[] toArray();

<T> T[] toArray(T[] a);

// Java 11, The default method, inherited from Collection.
default <T> T[] toArray​(IntFunction<T[]> generator)
Например:
List_toArray.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;

public class List_toArray {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("A"); // 0
        list.add("B"); // 1
        list.add("C"); // 2
        list.add("D"); // 3
        list.add("E"); // 4
        
        String[] array = new String[list.size()];
        
        list.toArray(array);
        
        for(String s: array)  {
            System.out.println(s);
        }
    }
}
Output:
A
B
C
D
E

8. sort(Comparator)

Метод sort(Comparator) по умолчанию опирается на объект Comparator, который предназначен для сравнения элементов в List и сортировки их по порядку.
default void sort(Comparator<? super E> c)
Пример: Объект List содержит элементы типа Book, мы сортируем их по цене и названию в порядке возрастания.
List_sort_ex1.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;

public class List_sort_ex1 {

    public static void main(String[] args) {
        Book b1 = new Book("Python Tutorial", 100f);
        Book b2 = new Book("HTML Tutorial", 120f);
        Book b3 = new Book("Java Tutorial", 300f);  
        Book b4 = new Book("Javafx Tutorial", 100f);  
        Book b5 = new Book("CSS Tutorial", 300f);  
        
        List<Book> bookList = new ArrayList<Book>();
        bookList.add(b1);
        bookList.add(b2);
        bookList.add(b3);
        bookList.add(b4);
        bookList.add(b5);
        
        // Sort by ascending price.
        // And Sort by ascending title.
        bookList.sort((book1, book2) -> {
            float a = book1.getPrice() - book2.getPrice();
            if(a > 0)  {
                return 1;
            } else if(a < 0) {
                return -1;
            }
            int b = book1.getTitle().compareTo(book2.getTitle());
            return b;
        });
        
        for(Book b: bookList)  {
            System.out.println(b.getPrice() +" : " + b.getTitle());
        }
    }
}
Output:
100.0 : Javafx Tutorial
100.0 : Python Tutorial
120.0 : HTML Tutorial
300.0 : CSS Tutorial
300.0 : Java Tutorial
В приведенном выше примере используются некоторые новые понятия, введенные из Java 8, такие как Functional interface, выражение Lambda. Вы можете прочитать больше из приведенных ниже статей, чтобы получить более подробное объяснение:

9. replaceAll(UnaryOperator)

Метод replaceAll(UnaryOperator) использует предоставленный параметр UnaryOperator для замены каждого элемента в List новым.
default void replaceAll(UnaryOperator<E> operator)
Например: List содержит элементы типа Book, заменяя каждый из его элементов Book новой Book для увеличения цены на 50%.
List_replaceAll.java
package org.o7planning.list.ex;

import java.util.ArrayList;
import java.util.List;

public class List_replaceAll {

    public static void main(String[] args) {
        Book b1 = new Book("Python Tutorial", 100f);
        Book b2 = new Book("HTML Tutorial", 120f);
        Book b3 = new Book("Java Tutorial", 300f);  
        Book b4 = new Book("Javafx Tutorial", 100f);  
        Book b5 = new Book("CSS Tutorial", 300f);  
        
        List<Book> bookList = new ArrayList<Book>();
        bookList.add(b1);
        bookList.add(b2);
        bookList.add(b3);
        bookList.add(b4);
        bookList.add(b5);
        
        // Replace Book with new Book with the price increased by 50%.
        bookList.replaceAll(b -> new Book(b.getTitle(), b.getPrice() * 150f/100));
        
        for(Book b: bookList)  {
            System.out.println(b.getPrice() + " : " + b.getTitle());
        }
    }
}
Output:
150.0 : Python Tutorial
180.0 : HTML Tutorial
450.0 : Java Tutorial
150.0 : Javafx Tutorial
450.0 : CSS Tutorial
  • Руководство Java UnaryOperator