convert - string list to array java 8




在Java中將數組轉換為列表 (12)

使用數組

這是將數組轉換為List的最簡單方法。 但是,如果您嘗試添加新元素或從列表中刪除現有元素,則會引發UnsupportedOperationException

Integer[] existingArray = {1, 2, 3};
List<Integer> list1 = Arrays.asList(existingArray);
List<Integer> list2 = Arrays.asList(1, 2, 3);

// WARNING:
list2.add(1);     // Unsupported operation!
list2.remove(1);  // Unsupported operation!

使用ArrayList或其他列表實現

您可以使用for循環將數組的所有元素添加到List實現中,例如ArrayList

List<Integer> list = new ArrayList<>();
for (int i : new int[]{1, 2, 3}) {
  list.add(i);
}

在Java 8中使用Stream API

您可以將數組轉換為流,然後使用不同的收集器收集流:Java 8中的默認收集器在屏幕後面使用ArrayList ,但您也可以強制實施您的首選實現。

List<Integer> list1, list2, list3;
list1 = Stream.of(1, 2, 3).collect(Collectors.toList());
list2 = Stream.of(1, 2, 3).collect(Collectors.toCollection(ArrayList::new));
list3 = Stream.of(1, 2, 3).collect(Collectors.toCollection(LinkedList::new));

也可以看看:

如何將數組轉換為Java中的列表?

我使用了Arrays.asList()但行為(和簽名)以某種方式從Java SE 1.4.2 (現在存檔的文檔)更改為8並且我在網上找到的大多數代碼片段都使用1.4.2行為。

例如:

int[] spam = new int[] { 1, 2, 3 };
Arrays.asList(spam)
  • 在1.4.2上返回一個包含元素1,2,3的列表
  • 在1.5.0+上返回一個包含數組垃圾郵件的列表

在很多情況下,應該很容易發現,但有時可能會被忽視:

Assert.assertTrue(Arrays.asList(spam).indexOf(4) == -1);

  1. 使用番石榴:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = Lists.newArrayList(sourceArray);
    
  2. 使用Apache Commons集合:

    Integer[] array = { 1, 2, 3};
    List<Integer> list = new ArrayList<>(6);
    CollectionUtils.addAll(list, array);
    

你必須投入陣列

Arrays.asList((Object[]) array)

使用兩行代碼將數組轉換為列表(如果使用整數值),則必須對原始數據類型使用自動裝箱類型

  Integer [] arr={1,2};
  Arrays.asList(arr);

問題在於,可變參數引入了Java5,不幸的是, Arrays.asList()也使用了可變參數版本。 所以Arrays.asList(spam)被Java5編譯器理解為int數組的可變參數。

有效Java第2版,第7章,第42項更詳細地解釋了這個問題。


在Java 8中,您可以使用流:

int[] spam = new int[] { 1, 2, 3 };
Arrays.stream(spam)
      .boxed()
      .collect(Collectors.toList());

在你的例子中,這是因為你不能有一個基本類型的列表。 換句話說, List<int>是不可能的。 但是,您可以有一個List<Integer>

Integer[] spam = new Integer[] { 1, 2, 3 };
Arrays.asList(spam);

這按預期工作。


如果你的目標是Java 8(或更高版本),你可以試試這個:

int[] numbers = new int[] {1, 2, 3, 4};
List<Integer> integers = Arrays.stream(numbers)
                        .boxed().collect(Collectors.<Integer>toList());

注意:

注意Collectors.<Integer>toList() ,這種通用方法可以幫助您避免“類型不匹配:無法從列表轉換為列表”錯誤。


它似乎遲了一點,但這是我的兩分錢。 我們不能讓List<int>成為int因此我們只能有List<Integer> 。 考慮一下我們有一個ints數組並使用Java 8的情況

 int[] ints = new int[] {1,2,3,4,5};
 List<Integer> list11 = Arrays.stream(ints).boxed().collect(Collectors.toList()); // Supported by Java 8

Integer數組的情況下,我們可以使用:

Integer[] integers = new Integer[] {1,2,3,4,5};
List<Integer> list21 =  Arrays.asList(integers); // Cannot modify returned list
List<Integer> list22 = new ArrayList<>(Arrays.asList(integers)); // good
List<Integer> list23 = Arrays.stream(integers).collect(Collectors.toList()); //Java 8

為什麼list21不能進行結構修改?

當我們使用Arrays.asList時,返回列表的大小是固定的,因為返回的列表不是java.util.ArrayList ,而是java.util.Arrays定義的私有靜態類。 所以,如果我們從返回的列表中添加或刪除元素,則會拋出UnsupportedOperationException 。 所以當我們想要修改列表時我們應該使用list22 。 如果我們有Java8,那麼我們也可以使用list23

為了清楚list21可以被修改,我們可以調用list21.set(index,element)但是這個列表可能不會被結構修改,即不能添加或從列表中刪除元素。 你也可以檢查這個question

具體實施

如果我們想要List的特定實現,例如ArrayList那麼我們可以使用toCollection

ArrayList<Integer> list24 = Arrays.stream(integers)
                          .collect(Collectors.toCollection(ArrayList::new));

我最近不得不將數組轉換為List。 稍後程序過濾試圖刪除數據的列表。 當您使用Arrays.asList(數組)函數時,您將創建一個固定大小的集合:既不能添加也不能刪除。 此條目解釋了比我更好的問題: 為什麼在嘗試從列表中刪除元素時會得到UnsupportedOperationException?

最後,我不得不做一個“手動”轉換:

    List<ListItem> items = new ArrayList<ListItem>();
    for (ListItem item: itemsArray) {
        items.add(item);
    }

我想我可以使用List.addAll(items)操作將數組轉換為列表。


更短:

List<Integer> list = Arrays.asList(1, 2, 3, 4);

談到轉換方式,這取決於你為什麼需要你的List 。 如果你只是需要它來讀取數據。 好的,在這裡你去:

Integer[] values = { 1, 3, 7 };
List<Integer> list = Arrays.asList(values);

但是,如果你做這樣的事情:

list.add(1);

你得到java.lang.UnsupportedOperationException 。 所以在某些情況下,你甚至需要這樣做:

Integer[] values = { 1, 3, 7 };
List<Integer> list = new ArrayList<Integer>(Arrays.asList(values));

第一種方法實際上並不轉換數組,而是像“ List ”那樣“代表”它。 但是,數組的所有屬性都像固定數量的元素一樣。 請注意,您在構建ArrayList時需要指定類型。





data-conversion