2017-10-10 42 views
-1

流我是新來的Java流和Lambda表達式。我有這樣的變量 -提取子字符串在Java

List<String> lines = Arrays.asList("ab,12,bd","df,23,df","ef,98,dg"); 

我希望這些行爲發生。

  1. 拆分列表中的每個元素。
  2. 提取結果數組中的第二個元素。 (這是數字)。
  3. 對其應用一些功能。爲了簡單起見,讓我們將它乘以2.
  4. 然後收集結果作爲列表,即包含24,46,196的列表。

    我試過在流中做,但我無法得到。任何指針都會有幫助。謝謝。

編輯:我試過這種方式,得到了結果 -

List<Integer> result1 = lines.stream() 
          .map(l -> l.split(",")[1]) 
          .map(l->Integer.parseInt(l)) 
          .collect(Collectors.toList()); 

,並得到結果

[12, 23, 98] 

這是做物流的正確方法是什麼?

+1

請出示當前爲了更好地說明你的描述。 –

+0

嘗試過什麼?分享它,這有助於理解你無法解決的問題。 – nullpointer

+0

已添加我的代碼.. –

回答

1

它應該是直截了當的。基於更新的問題

lines.stream().map(s -> Integer.parseInt(s.split(",")[1]) * 2).collect(Collectors.toList()); 

更新這是做物流的正確方法是什麼?

是的。您可以將兩個map操作進一步合併爲一個像上面所示的操作。

+0

這裏使用split()方法比使用正則表達式的性能要差一些,因爲當我們只需要一個元素時,它會創建一個包含所有元素的額外數組。 – Tet

+0

@Tet:您可以指定「split」限制以避免不必要的工作。在這種情況下,它可能比正則表達式更有效,因爲'String.split'對於單個char模式具有快速路徑。但是,如果性能真的很重要,那麼使用'indexOf'和'substring'編寫一個專用的方法可能會更快。 – Holger

1

爲您做以下工作?

lines.stream().map(s -> s.split(",")[1]) 
    .map(Integer::parseInt) 
    .map(f) 
    .collect(Collectors.toList()); 

其中fInteger的功能,你想在你的最終名單使用的類型。

+0

在這裏使用split()方法的性能比僅使用正則表達式的性能要差,因爲它在創建包含所有元素的額外數組時我們只需要一個元素 – Tet

1

什麼:

List<Integer> result = lines.stream() 
    .map(line -> line.replaceFirst(".*,(\\d+),.*", "$1")) 
    .map(num -> 2 * Integer.parseInt(num)) 
    .collect(Collectors.toList()); 

您可能要轉換爲int[]在這種情況下,你可以使用:

int[] result = lines.stream() 
    .map(line -> line.replaceFirst(".*,(\\d+),.*", "$1")) 
    .mapToInt(num -> 2 * Integer.parseInt(num)) 
    .toArray();