用Java在Stream中提取子字符串

时间:2017-10-10 17:16:21

标签: java java-8 java-stream

我是Java中的Streams和Lambdas的新手。我有一个像这样的变量 -

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

我希望这些行动能够实现。

  1. 拆分列表中的每个元素。
  2. 在结果数组中提取第二个元素。 (即数字)。
  3. 在其上应用一些功能。为了简单起见,我想把它乘以2.
  4. 然后将结果收集为列表,即包含24,46,196的列表。

    我尝试在溪流中做到这一点,但我无法得到。任何指针都会有所帮助。谢谢。

  5. 编辑:我试过这种方式并得到了结果 -

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

    得到结果

    [12, 23, 98]
    

    这是做流的正确方法吗?

3 个答案:

答案 0 :(得分:1)

以下是否适用于您?

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

其中f是您从Integer到您要在最终列表中使用的类型的函数。

答案 1 :(得分:1)

应该是直截了当的。

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

根据更新的问题更新

  

这是做流的正确方法吗?

是。您可以进一步将两个map操作合并为一个,如上所示。

答案 2 :(得分: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();